Zdieľanie globálna premenná z C++ knižnica C hlavný program

0

Otázka

Mám gstdsexample.soC++ knižnica. Vnútri, má dve globálne premenné, ktoré by som chcel zdieľať medzi knižnici a na hlavnej C program.

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Test dva scenáre.

Scenár 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__ */

Patrí sharedata.h v gstdsexample.cpp a main.c. Zostavovanie OK, ale ja si segmentácia vinou, keď sa gstdsexample.cpp zapisuje údaje do *ptr.

Scenár 2

Vyhlásiť dve premenné v

gstdsexamle.cpp

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Potom vyhlási, ako extern v main.c.

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

Teraz som neurčená odkaz chyby do dvoch premenných pri zostavovaní main.c.

Scenár 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__ */

Potom obsahovať sharedata.h v gstdsexample.cpp a main.c. Kompilácia pre cpp lib je v poriadku. Ale zostavovaní pre hlavné.c má chyby ako

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));

Ako zdieľať premenných medzi C++ a C zdrojové súbory?

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

Najlepšiu odpoveď

1

v hlavičke súboru... 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

v gstdsexamle.c

#include "gstdsexamle.h"

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

v hlavnej.c

#include "gstdsexamle.h"

To je všetko, čo potrebujete. mutex & ptr sú teraz k dispozícii v hlavnej.cpp/main.c

2021-11-24 04:47:45

gstdsexample lib je v poriadku. Ale hlavné.c má neurčená chyby ako "undefined odkaz na mutex a neurčená odkaz na ptr'
batuman

Tiež som musieť vyhlásiť v hlavnej.c pthread_mutex_t mutex; int *ptr;
batuman
0

Scenár 1 scenár 2 sú neplatné, pretože C++ mangľov názvy C++ identifikátorov umožniť identifikátor preťaženiu.

Scenár 3 zlyhá, pretože extern "C" { } constructor je syntaktickej konštrukcie platné len v C++ a nie je právne v C. mohli urobiť, musíte analyzovať

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

uviesť C++ kompilátor, že sú premenné byť compatibilized s C volanie schémy.

Ale jazyk C nie je si vedomý niečo, čo prichádza z iného jazyka, takže v C, tieto vyhlásenia sa musia zobrazovať ako:

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

v hlavičke súboru, ale bez neplatná syntax.

Prístup, ktorý bol vystavený v anotheer odpoveď, tak som sa nevzťahuje vysvetlenie toho, čo sa hovorí, že tam, stačí povedať, že __cplusplus__ makro je definovaná kompilátor automaticky, keď to pôsobí ako C++ kompilátor, takže môžu byť použité ako v iných odpoveď, ak chcete umožniť hlavička súboru zdieľať C a C++ vyhlásenia.

2021-11-25 07:26:38

V iných jazykoch

Táto stránka je v iných jazykoch

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