Schimbul global variabilă de la C++ bibliotecă pentru C principală a programului

0

Problema

Am gstdsexample.soun C++ bibliotecă. În interior, are două variabile globale care aș vrea să împărtășesc între bibliotecă și principalul program C.

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Test două scenarii.

Scenariul 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__ */

Include sharedata.h în gstdsexample.cpp și main.c. Compilatie OK dar am o eroare de segmentare când gstdsexample.cpp scrie date la *ptr.

Scenariul 2

Declara două variabile în

gstdsexamle.cpp

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Apoi declara ca extern în main.c.

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

Acum am nedefinit de referință erorile celor două variabile atunci când compilarea main.c.

Scenariul 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__ */

Apoi includ sharedata.h în gstdsexample.cpp și main.c. Compilarea pentru cpp lib este bine. Dar compilarea pentru principal.c a erorile ca

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

Cum de a împărtăși variabile intre C++ si C sursă de fișiere?

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

Cel mai bun răspuns

1

într-un fișier antet... 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

în gstdsexamle.c

#include "gstdsexamle.h"

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

în principal.c

#include "gstdsexamle.h"

Asta e tot ce ai nevoie. mutex & ptr ca sunt acum disponibile în principal.cpp/main.c

2021-11-24 04:47:45

gstdsexample lib este bine. Dar principala.c a nedefinite erori ca `nedefinit referire la mutex și nedefinit de referință să ptr'
batuman

Am, de asemenea, trebuie să declare acest lucru în principal.c pthread_mutex_t mutex; int *ptr;
batuman
0

Scenariul 1 și scenariul 2 sunt invalid, deoarece C++ mangles numele de C++ de identificare pentru a permite o identificare supraîncărcarea.

Scenariul 3 eșuează pentru că extern "C" { } constructorul este o construcție sintactică valabil numai în C++ și nu este legal, în C. Pentru a fi capabil de a face acest lucru, aveți nevoie pentru a analiza

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

pentru a indica C++ compiler că acestea sunt variabile să fie compatibilized cu C schema de asteptare.

Dar limbajul C nu este conștient de ceva ce vine dintr-o altă limbă, astfel încât în C, aceste declarații trebuie să apară ca:

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

în fișierul antet, dar fără invalid syntax.

O abordare care a fost expus în anotheer răspuns, așa că nu va prelungi explicarea a ceea ce este spus acolo, doar să spun că __cplusplus__ macro este definit de către compilator în mod automat atunci când acesta acționează ca un compilator C++, astfel încât poate fi folosit și în alt răspuns pentru a permite fișierul antet pentru a partaja C și C++ declarații.

2021-11-25 07:26:38

În alte limbi

Această pagină este în alte limbi

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