From a82971b559df519eef8e4fbcd692c8ea6c2e29a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BD=92=E6=95=85=E9=87=8C?= <3326284481@qq.com> Date: Mon, 27 Nov 2023 10:38:47 +0800 Subject: [PATCH 1/2] =?UTF-8?q?#114=20`extern=20"C"`=20=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 45d8f22..ec516d7 100644 --- a/README.md +++ b/README.md @@ -324,10 +324,38 @@ Bit mode: 2; // mode 占 2 位 ### extern "C" -* 被 extern 限定的函数或变量是 extern 类型的 -* 被 `extern "C"` 修饰的变量和函数是按照 C 语言方式编译和链接的 +- 可以与使用 C 语言编写的函数进行链接,使得在 C++ 中定义能从 C 单元调用的函数成为可能 -`extern "C"` 的作用是让 C++ 编译器将 `extern "C"` 声明的代码当作 C 语言代码处理,可以避免 C++ 因符号修饰导致代码不能和C语言库中的符号进行链接的问题。 +`extern "C"` 的作用是让 C++ 编译器将 `extern "C"` 声明的代码导出符号像 C 一样,可以避免 C++ 因符号修饰导致代码不能和 C 语言库中的符号进行链接的问题。 + +这里需要注意的是,使用 `extern "C"` 也不代表导出的符号没有额外的修饰,这根据编译器,环境,等等,另外 C 没有标准的 ABI(符号修饰)。 + +即使不使用 `extern "C"` 也不代表一定会被添加额外符号的修饰,比如: + +```cpp +#include + +int a = 0; + +namespace ss{ + int a = 0; +} + +extern int _ZN2ss1aE; + +int main(){ + _ZN2ss1aE = 100; + std::cout< Date: Mon, 27 Nov 2023 10:40:57 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E5=85=B3?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec516d7..d5caa59 100644 --- a/README.md +++ b/README.md @@ -472,7 +472,7 @@ static union { }; int main() { - UnionTest extern; + UnionTest u; union { int i;