Wspólne korzystanie z globalnej zmiennej z biblioteki C++ w podstawowy program na C

0

Pytanie

Mam gstdsexample.sobiblioteka C++. Wewnątrz ma dwie zmienne globalne, którymi chciałbym podzielić się między biblioteką i głównym programem w języku C.

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Przetestuj dwa scenariusze.

Scenariusz 1

sharedata.h

#ifndef __SHARE_DATA_H__
#define __SHARE_DATA_H__
#include <stdio.h>
#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

#endif /* __SHARE_DATA_H__ */

Obejmować sharedata.h w gstdsexample.cpp i main.c. Kompilacja ok, ale pojawia się błąd segmentacji, gdy gstdsexample.cpp zapisuje dane w *ptr.

Scenariusz 2

Zadeklaruj dwie zmienne w

gstdsexamle.cpp

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Następnie należy zadeklarować, jak extern w main.c.

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

Teraz mam nieokreślone błędy linków na dwie zmienne podczas kompilacji main.c.

Scenariusz 3:

#ifndef __SHARE_DATA_H__
#define __SHARE_DATA_H__
#include <stdio.h>
#include <pthread.h>

extern "C" {
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
}


#endif /* __SHARE_DATA_H__ */

Następnie włącz sharedata.h w gstdsexample.cpp i main.c. Kompilacja biblioteki cpp - to normalne. Ale kompilacja dla main.c) zawiera błędy, takie jak

error: expected identifier or ‘(’ before string constant
 extern "C" {
        ^~~
deepstream_app_main.c: In function ‘all_bbox_generated’:
deepstream_app_main.c:98:24: error: ‘mutex’ undeclared (first use in this function); did you mean ‘GMutex’?
   pthread_mutex_lock( &mutex );
                        ^~~~~
                        GMutex
deepstream_app_main.c:98:24: note: each undeclared identifier is reported only once for each function it appears in
deepstream_app_main.c:101:21: error: ‘ptr’ undeclared (first use in this function); did you mean ‘puts’?
     printf("%d ", *(ptr+x));

Jak wymieniać między zmiennymi pliki źródłowe C++ i C?

c++ global-variables
2021-11-24 03:54:36
2

Najlepsza odpowiedź

1

w systemowym pliku nagłówkowym... gstdsexamle.h

// disable name mangling in C++
#ifdef __cplusplus
extern "C" {
#endif

// declare your two vars in the header file as extern. 
extern pthread_mutex_t mutex;
extern int *ptr;


#ifdef __cplusplus
}
#endif

w gstdsexamle.c

#include "gstdsexamle.h"

/* only initialise here */
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

w zasadzie.c

#include "gstdsexamle.h"

To wszystko, co jest ci potrzebne. mutex i ptr teraz dostępne w main.cpp/main.c

2021-11-24 04:47:45

biblioteka gstdsexample w porządku. Ale w main.c jest nieokreślone błędy, takie jak "niepewna link do mutex i niepewna link na ptr".
batuman

Muszę również ogłosić o tym w main.c pthread_mutex_t mutex; int *ptr;
batuman
0

Scenariusz 1 scenariusz 2 niedopuszczalne, ponieważ C++ zniekształca identyfikatorów C++, aby zapewnić przeciążenie identyfikatorów.

Scenariusz 3 kończy się niepowodzeniem, ponieważ extern "C" { } konstruktor jest elementem składni, dopuszczalna tylko w C++, a ona nie jest legalna w C. Aby móc to zrobić, trzeba analizować

extern "C" {
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
}

aby określić kompilator C++, że są zmiennymi, które powinny być zgodne ze schematem połączeń C.

Ale język C nie wie o czymś, wychodzące z innego języka, więc w C te reklamy będą wyświetlane jako:

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

w systemowym pliku nagłówkowym, ale bez nieprawidłową składnię.

Podejście został zlikwidowany w młodszym odpowiedzi, więc nie będę szczegółowo wyjaśnić, co jest tam napisane tylko po to, żeby powiedzieć, że __cplusplus__ makro jest wykrywane przez kompilator automatycznie, gdy działa on jak kompilator C++, więc można go używać, jak i w innej odpowiedzi, aby umożliwić pliku nagłówka wspólnie korzystać z reklamy C i C++.

2021-11-25 07:26:38

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................