如何在C和C++代码之间共享变量
How do I share variables between C and C++ code?
我正在开发一个实现C代码的C++项目,但遇到了分段错误。当我试图访问C++代码中的全局C变量时,会出现segfault。
代码概述:
我有一个名为video_stage.c的c文件,其中包含以下代码片段:
#include "video_stage.h"
uint8_t* pixbuf_data = NULL; //pointer to video buffer
vp_os_mutex_t video_update_lock = PTHREAD_MUTEX_INITIALIZER;
C_RESULT output_gtk_stage_transform( void *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out)
{
vp_os_mutex_lock(&video_update_lock);
/* Get a reference to the last decoded picture */
pixbuf_data = (uint8_t*)in->buffers[0];
vp_os_mutex_unlock(&video_update_lock);
return (SUCCESS);
}
此函数由其他C代码周期性调用,并更新指向RGB视频帧的pixbuf_data指针。
这是头文件video_stage.h:
#ifndef _IHM_STAGES_O_GTK_H
#define _IHM_STAGES_O_GTK_H
#ifdef __cplusplus
extern "C" {
#endif
#include <config.h>
#include <VP_Api/vp_api_thread_helper.h>
#include <VP_Api/vp_api.h> //hier zit vp_os_mutex in geinclude
PROTO_THREAD_ROUTINE(video_stage, data);
#ifdef __cplusplus
}
#endif
extern uint8_t* pixbuf_data;
extern vp_os_mutex_t video_update_lock;
#endif // _IHM_STAGES_O_GTK_H
头文件包含pixbuf_data指针的外部声明。
这里是cpp文件:device.cc:
#include <iostream>
#include "video_stage.h"
int ardrone_update(ardrone_t *d)
{
uint8_t x;
x = pixbuf_data[0]; //no problem here, this is executed
std::cout << 5 << std::endl; //this is executed too
std::cout << x << std::endl; //segfault occures here
}
当(由其他cpp代码)调用cpp文件中的函数时,在打印x.的cout指令处会发生segfault
当我对c文件中缓冲区的第一个元素进行printf时,我得到了我所期望的。
我确信这与c和c++代码的混合有关,但根据我的研究,我已经做了一些事情,使c和c++的代码在这里兼容。
在C++代码中,在C源中定义的pixbuf_data
必须用C链接声明:
extern "C" uint8_t* pixbuf_data;
如果没有extern "C"
,C++代码就不能链接,除非存在具有C++链接的pixbuf_data
的另一个(重复的)定义。
给自己一个调试器,并在它下运行程序。跟踪代码根本不会告诉您segfault出现在哪里,IO很慢。
在您向我们展示的代码中,您似乎没有为pixbuf_data
分配内存。当你访问它而不给它分配一个有效的指针时,任何事情都可能发生。
我正在尝试在C项目和C++项目之间共享变量。但当我构建解决方案时,我得到了"错误LNK2001:未解析的外部符号"struct-configurationg_conf
===在C项目中===
我创建了一个头文件,并在上面创建了我的结构
typedef struct{ int maxUser; }Configuration;
extern Configuration conf;
======在C++项目中======
在主文件中:
#include "../ProjectC/header.h"
int main(){ conf.maxUser = 10; }
相关文章:
- 在c代码之间共享数据的最佳方式
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 当我使用按引用返回时,我不知道这些代码之间的区别
- 如何在括号与代码之间添加空格以进行C++?
- 这两个代码之间的差异(为什么我的数组也有额外的空间,即使我限制了它)
- 无法将Android WebView渲染到C 和Java代码之间共享的外部纹理中
- 这些代码之间的区别在哪里?输出不应该是一样的吗?
- Objective-C源代码和clang -rewrite-objc C++代码之间有什么关系?
- 框架代码和普通代码之间的区别
- FFMPEG生成的零散的MP4文件和代码之间的不同之处在于
- 我不知道为什么只有一个代码在两个代码之间具有sigsegv(看起来相同)
- 为什么这两个代码之间的运行时间差异这么长
- C# 和 C++ 代码之间的链接在 64 位计算机中不起作用
- 在C++和Fortran代码之间传递复数数组
- 在C++和 Python 代码之间转移控制权
- 在托管代码和非托管代码之间传递非托管结构的安全数组
- 自定义Direct2D呈现托管代码和非托管代码之间的批封送处理
- 是否有Visual c++编译器在线,以及如何在c++和vs简单代码之间转换
- 在我的c++代码之间向matlab传递一个字符串变量
- 这些C++代码之间有什么区别