分享全球变量从C++库C主要程序

0

的问题

gstdsexample.soC++图书馆。 内部,它有两个全球变量,我想分享一间图书馆和主要的C节目。

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

测试两种情况。

方案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__ */

包括 sharedata.hgstdsexample.cppmain.c. 编制确定的,但我获得一个分割的故障时 gstdsexample.cpp 写数据 *ptr.

方案2

宣布两个变量

gstdsexamle.cpp

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;

然后声明 externmain.c.

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

现在我不确定基准错误的两个变量在汇编 main.c.

方案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__ */

然后包括 sharedata.hgstdsexample.cppmain.c. 编译为cpp lib是好的。 但编制为主。c已经为错误。

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++和C的来源的文件?

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

最好的答案

1

在一个标题的文件...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

在gstdsexamle.c

#include "gstdsexamle.h"

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

在主要的。c

#include "gstdsexamle.h"

这就是你所需要的。 互斥&ptr现在可以在主要的。cpp/主。c

2021-11-24 04:47:45

gstdsexample lib是好的。 但是主要的。c尚未定义的错误作为`定义参照互斥和未定义的参考ptr'
batuman

我还要宣布,在主要的。c pthread_mutex_t mutex; int *ptr;
batuman
0

方案1和方案2是无效的,因为C++机的名字C++标识符,以允许识别符超载。

方案3的失败,因为 extern "C" { } 构造是语法建筑的有效 只有在C++ ,这是不合法的C.能够这样做,你需要分析

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

指示C++编译器,他们是变量是增容与C调架构。

但是,C语言是不知道的东西来自不同的语言,以便在C中,这些声明必须显示为:

extern pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
extern int *ptr;

在该标题的文件,但没有无效的语法。

一种做法已经暴露在anotheer回答,所以我将不会延伸解释什么是说那里,只是说 __cplusplus__ 宏观定义是通过编译器自动时,它是作为一个C++编译器,以便可以用作在其他的答案,以允许的标题的文件来分享C和C++的声明。

2021-11-25 07:26:38

其他语言

此页面有其他语言版本

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