#ifdef __cplusplus extern "C"
时间: 2023-10-13 12:27:05 浏览: 85
这是一个 C++ 代码中常见的 extern "C" 声明,它的作用是告诉编译器这段代码需要按照 C 语言的规则进行编译和链接。
在 C++ 中,函数名会被编译成加上命名空间和函数签名的符号,而 C 语言中则不会。如果 C++ 函数需要在 C 语言代码中被调用,就需要使用 extern "C" 来告诉编译器将其符号按照 C 语言的方式进行命名。
例如,在 C++ 中定义的函数:
```cpp
namespace my_namespace {
void my_function(int arg);
}
```
编译后的符号名可能会是 `_ZN12my_namespace12my_functionEi`,而在使用 C 语言调用该函数时,需要的符号名是 `my_function`。因此,我们可以在 C++ 代码中这样声明该函数:
```cpp
extern "C" void my_function(int arg);
```
这样,在编译时就会按照 C 语言的方式生成符号名,使得该函数可以被 C 语言代码调用。
另外,在 C++ 中,如果一个函数需要被多个文件使用,就需要声明为 extern "C",否则每个文件都会生成不同的符号名,导致链接错误。
相关问题
#include <iostream> #include <unistd.h> #include "opencv_face_process.h" #include "socket_server.h" #include "user_mngr.h" #include <QApplication> /* C++ include C */ #ifdef __cplusplus extern "C" { #endif /* C head file */ #ifdef __cplusplus } #endif using namespace std; struct main_mngr_info main_mngr; int main(int argc, char* argv[]) { QApplication qtApp(argc, argv); (void)argc; (void)argv; cout << "hello background_app" << endl; memset(&main_mngr, 0, sizeof(struct main_mngr_info)); /* load config file */ main_mngr.config_ini = iniparser_load(PATH_CONFIG_INI); if(main_mngr.config_ini == NULL) { printf("WARNING: %s: load [%s] failed, will use default value.\n", __FUNCTION__, PATH_CONFIG_INI); //return -1; // will use default value } main_mngr.work_state = WORK_STA_NORMAL; main_mngr.user_handle = -1; main_mngr.mngr_handle = -1; main_mngr.capture_flag = 0; user_mngr_init(); start_face_process_task(); start_socket_server_task(); return qtApp.exec(); // start qt application, message loop ... }
这是一个C++程序的main函数,其中包含了一些头文件的引用和命名空间的声明。接下来创建了一个结构体main_mngr_info的实例main_mngr,并初始化为零。然后加载配置文件,并检查加载是否成功。如果加载失败,会打印警告信息,但程序会继续执行。接着对main_mngr的一些成员进行赋值操作。然后调用user_mngr_init()函数进行用户管理的初始化。接下来启动人脸处理任务和套接字服务器任务。最后通过qtApp.exec()启动Qt应用程序的消息循环。
#ifdef __cplusplus extern "C" { #endif /* __cplusplus */
`#ifdef __cplusplus`是C/C++中的条件编译指令,它的作用是判断当前代码是否在C++环境下进行编译。如果是C++环境,就会执行`extern "C" {}`内部的代码,这样可以避免C++编译器将C语言的函数名进行名称修饰。
`extern "C"`是一个C++的语法,它的作用是告诉编译器,其内部声明的函数应按照C语言的方式进行链接和调用,这样可以实现C与C++的混合编程。
在C++中,默认情况下会对函数名称进行名称修饰(name mangling),这是因为C++支持函数重载,而函数重载需要根据参数类型和个数来区分不同的函数。而C语言不支持函数重载,因此不需要进行名称修饰。
回答完问题后,我提供几个相关问题:
相关问题:
1. `#ifdef __cplusplus`的作用是什么?
2. 什么时候需要在C++代码中使用`extern "C"`?
3. C和C++之间有哪些差异?
阅读全文