C++中的extern
关键字和跨语言互操作
变量的声明与定义
extern
关键字用于声明在另一个翻译单元(文件)中定义的变量或函数。通过extern
关键字,可以在多个文件中访问全局变量或函数。
变量声明示例
文件:main.cpp
#include <iostream>// 声明外部变量
extern int globalVariable;int main() {std::cout << "全局变量: " << globalVariable << std::endl;return 0;
}
文件:global.cpp
// 定义外部变量
int globalVariable = 42;
函数声明示例
文件:main.cpp
#include <iostream>// 声明外部函数
extern void printMessage();int main() {printMessage();return 0;
}
文件:functions.cpp
#include <iostream>// 定义外部函数
void printMessage() {std::cout << "来自另一个文件的消息!" << std::endl;
}
编译
要编译并链接这些文件,可以使用如下命令:
g++ main.cpp global.cpp functions.cpp -o myProgram
extern "C"
来与 C 代码进行互操作
extern "C"
关键字在 C++ 中用于指示编译器以 C 语言的方式来处理声明的函数或变量,从而实现 C 和 C++ 代码的互操作。
C 代码部分
文件:example.c
#include <stdio.h>// 这是一个 C 函数
void hello_from_c() {printf("Hello from C!\n");
}// 这是一个接受两个整数并返回它们和的 C 函数
int add(int a, int b) {return a + b;
}
C++ 代码部分
文件:main.cpp
#include <iostream>// 使用 extern "C" 来声明 C 函数
extern "C" {void hello_from_c();int add(int a, int b);
}int main() {// 调用 C 函数hello_from_c();// 调用 C 的加法函数int result = add(3, 4);std::cout << "The result of add(3, 4) is: " << result << std::endl;return 0;
}
编译和运行
要编译和运行这个程序,需要执行以下步骤:
-
首先编译 C 文件:
gcc -c example.c -o example.o
-
然后编译 C++ 文件并链接 C 文件:
g++ main.cpp example.o -o main
-
最后运行生成的可执行文件:
./main
执行后,应该会看到以下输出:
Hello from C!
The result of add(3, 4) is: 7
与 C 代码共享全局变量
C++ 代码可以访问 C 代码中定义的全局变量,反之亦然。
C 代码
文件:example.c
int shared_variable = 10;void print_shared_variable() {printf("Shared variable: %d\n", shared_variable);
}
C++ 代码
文件:main.cpp
#include <iostream>extern "C" {extern int shared_variable;void print_shared_variable();
}int main() {std::cout << "Shared variable in C++: " << shared_variable << std::endl;print_shared_variable();return 0;
}
与 C 库的互操作
通过extern "C"
,可以在 C++ 中使用用 C 编写的库。
C 库头文件
文件:mylib.h
#ifndef MYLIB_H
#define MYLIB_Hvoid c_function();#endif
C 库实现
文件:mylib.c
#include "mylib.h"
#include <stdio.h>void c_function() {printf("Function from C library\n");
}
C++ 代码
文件:main.cpp
#include <iostream>extern "C" {#include "mylib.h"
}int main() {c_function();return 0;
}
抑制编译器对未使用参数的警告
为了避免编译器对未使用参数发出警告,可以使用如下方法:
void func(int signal) {(void)signal; // 忽略未使用的参数warning
}
这一行是一种显式标记signal
参数为未使用的方式,从而抑制编译器的警告。