Compartir variable global de la biblioteca de C++ a C programa principal

0

Pregunta

Tengo gstdsexample.souna biblioteca de C++. En el interior, tiene dos variables globales a las que me gustaría compartir entre la biblioteca y la principal C programa.

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Prueba los dos escenarios.

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

Incluyen sharedata.h en gstdsexample.cpp y main.c. Compilación OK pero me sale un error de segmentación cuando gstdsexample.cpp escribe datos a *ptr.

Escenario 2

Declarar dos variables en

gstdsexamle.cpp

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

Luego de declarar como extern en main.c.

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

Ahora tengo indefinido errores de referencia para las dos variables al compilar main.c.

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

A continuación, incluir sharedata.h en gstdsexample.cpp y main.c. La compilación para cpp lib está bien. Pero compilar principal.c tiene errores como

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

Cómo compartir variables entre C++ y C archivos de origen?

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

Mejor respuesta

1

en un archivo de encabezado... 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

en gstdsexamle.c

#include "gstdsexamle.h"

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

en principal.c

#include "gstdsexamle.h"

Eso es todo lo que usted necesita. objeto mutex & ptr están ahora disponibles en la principal.cpp/main.c

2021-11-24 04:47:45

gstdsexample lib está bien. Pero la principal.c ha indefinido errores como "indefinido referencia a la exclusión mutua y el indefinido referencia a ptr'
batuman

También debo declarar esta en la principal.c pthread_mutex_t mutex; int *ptr;
batuman
0

Escenario 1 y escenario 2 no son válidos debido a que C++ destroza los nombres de los C++ identificadores para permitir el identificador de la sobrecarga.

Escenario 3 falla porque el extern "C" { } constructor es un sintáctica de la construcción válida sólo en C++ y no es legal en C. Para ser capaz de hacer esto, es necesario analizar

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

para indicar al compilador de C++ que son variables a ser compatibilized con llamada de C esquema.

Pero el lenguaje C no es consciente de algo que viene de un idioma diferente, por lo que en C, esas declaraciones deben aparecer como:

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

en el archivo de encabezado, pero sin la sintaxis no válida.

Un enfoque ha sido expuesto en anotheer respuesta, así que no voy a extender explicando lo que se dice allí, sólo para decir que __cplusplus__ macro se define por el compilador automáticamente cuando no está actuando como un compilador de C++, por lo que pueden ser usados como en la otra respuesta para permitir que el archivo de encabezado para compartir C y C++ declaraciones.

2021-11-25 07:26:38

En otros idiomas

Esta página está en otros idiomas

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