Sdílení globální proměnné z C++ knihovna pro C hlavní program

0

Otázka

Mám gstdsexample.soC++ knihovna. Uvnitř, má dvě globální proměnné, které bych se chtěl podělit mezi knihovnou a hlavní C programu.

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Test dvou scénářů.

Scénář 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__ */

Patří sharedata.h v gstdsexample.cpp a main.c. Kompilace OK, ale já si segmentace chyba, když gstdsexample.cpp zapisuje data do *ptr.

Scénář 2

Deklarovat dvě proměnné v

gstdsexamle.cpp

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Pak deklarovat jako extern v main.c.

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

Teď mám undefined reference chyby na dvou proměnných při sestavování main.c.

Scénář 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__ */

Pak zahrnují sharedata.h v gstdsexample.cpp a main.c. Kompilace pro cpp lib je v pořádku. Ale kompilaci pro hlavní.c má chyby jako

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 sdílet proměnné mezi C++ a C zdrojové soubory?

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

Nejlepší odpověď

1

v záhlaví souboru... 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 hlavní.c

#include "gstdsexamle.h"

To je vše, co potřebujete. mutex a ptr jsou nyní k dispozici v hlavní.cpp/hlavní.c

2021-11-24 04:47:45

gstdsexample lib je v pořádku. Ale hlavní.c má nedefinované chyby jako `undefined reference na mutex a nedefinované odkaz na ptr'
batuman

Také jsem třeba toto uvést v hlavní.c pthread_mutex_t mutex; int *ptr;
batuman
0

Scénář 1 a scénář 2 jsou neplatné, protože C++ mandly jména C++ identifikátory umožňují identifikátor přetížení.

Scénář 3 se nezdaří, protože extern "C" { } konstruktor je syntaktické výstavby platné pouze v C++ a to není legální v C. Chcete být schopni to udělat, budete muset analyzovat

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

k označení C++ kompilátor, že jsou proměnné, které se budou compatibilized s C volání schématu.

Ale jazyk C není vědom, že se něco blíží z jiného jazyka, tak v C, tato prohlášení musí být uvedeny jako:

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

v záhlaví souboru, ale i bez neplatné syntaxi.

Přístup byl vystaven v anotheer odpověď, tak jsem se rozšířit vysvětlovat, co je tam řečeno, jen říct, že __cplusplus__ makro je definován překladač automaticky, když je to působí jako kompilátor C++, tak, že může být použit jako v jiné odpovědi, aby záhlaví souboru sdílet C a C++ prohlášení.

2021-11-25 07:26:38

V jiných jazycích

Tato stránka je v jiných jazycích

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