不可小看的extern "C"

在项目中尝试将C语言编写的模块与C++代码结合时遇到链接错误。通过加入extern C语法解决了编译问题,确保了C语言函数在C++环境中正确调用。

     项目中要用到一个模块。看了下该模块的用法,就依葫芦画瓢的搬到自己的代码里面来了。不过在编译的时候碰到了麻烦, 在程序链接的时候出错:“undefined reference to***",应该是因为没有包含相应的库文件吧。

      于是比较了make file文件的写法,试图在我这边的makefile 中加上相应的库。但是折腾了半天,未解决。在网上搜了半天,没有点头绪,忽然一个帖子中的一句话提醒了我,“或者就是c++   和c对同名的函数编译出的函数名字是不一样的。所以呢要extern   c”。赶紧看我们的代码!果然,我引用的模块是用c写的,但是它的相应函数没用放在extern C{}内;而我这部分用的是C++。。。

     于是在相应部位加上 #ifdef __cplusplus

                                      extern "C" {

                                  #endif

和#ifdef __cplusplus

    }

  #endif。链接通过了! 

     一个经验是为了c代码能在C++中方便的使用,一定要在c程序相应头文件中加上 extern  "C"。

在C语言中,不使用 `extern` 关键字的变量或函数声明通常意味着这些声明是默认可见性的一部分。这种做法主要依赖于 C 语言的隐式规则来控制作用域和链接性。 ### 函数声明 如果不使用 `extern` 来声明一个函数,那么该函数默认被视为具有外部链接(external linkage),这意味着它可以在其他文件中被调用。例如: ```c int add(int a, int b); // 隐含了 extern,等价于 extern int add(int a, int b); ``` 在这种情况下,编译器会自动假设这个函数是外部可访问的,并且会在程序的其他部分寻找其定义。如果函数定义出现在同一个源文件中,则不需要额外的 `extern` 声明;如果函数定义在另一个源文件中,则需要通过头文件包含该声明[^3]。 ### 变量声明 对于全局变量,如果不使用 `extern` 进行声明,则变量会被认为是在当前翻译单元内定义的。这限制了变量的作用域仅限于当前文件。例如: ```c int count; // 定义了一个全局变量 ``` 然而,如果希望从另一个文件访问此全局变量,则必须在那个文件中使用 `extern` 来声明该变量。否则,未加 `extern` 的声明将导致编译错误,因为编译器不会去查找其他文件中的同名变量[^2]。 ### 示例说明 考虑两个文件:`file1.c` 和 `file2.c`。其中 `file1.c` 包含全局变量 `num` 的定义: ```c // file1.c #include <stdio.h> int num = 10; // 全局变量定义 void printNum() { printf("Number is %d\n", num); } ``` 而在 `file2.c` 中想要访问 `num`,就需要进行 `extern` 声明: ```c // file2.c #include <stdio.h> extern int num; // 声明外部变量 int main() { extern void printNum(); // 可以省略 extern printNum(); printf("Accessed number from file1: %d\n", num); return 0; } ``` 这里 `printNum()` 函数的声明可以省略 `extern`,因为它默认就是外部链接。但是 `num` 必须显式地用 `extern` 来声明,以便告诉编译器这个变量是在别处定义的[^5]。 ### 注意事项 - **不能在函数体内使用 `extern`**:尝试在函数内部使用 `extern` 关键字会导致编译错误。所有关于外部变量或函数的声明都应当放在函数之外。 - **避免重复定义**:确保每个全局变量或函数只在一个地方被定义一次,而其他地方只是声明它们。 - **头文件管理**:为了更好地组织代码,通常会把 `extern` 声明放入头文件中,并由需要使用的源文件包含这些头文件。 通过遵循上述规则与实践,开发者可以在不直接使用 `extern` 的情况下正确地处理大部分变量和函数的声明问题。不过,在跨文件共享数据时,合理利用 `extern` 是必不可少的。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值