1.由于不同的编译器对处理c和c++命名在符号表中的不一致。所以在用一个c++编译器去编译一个c代码。可能导致该c代码会用c++的规则去命名符号,以至于后面再去链接相应的c库的时候,不能找到对应的定义。
故在大部分.h文件中,容易看到如下申明:
-
#ifdef __cplusplus
-
extern "c" {
-
#endif
-
;;;;
-
#ifdef __cplusplus
-
}
-
#endif
2.编译在处理符号时候,存在强弱符号处理的差别:
强符号--函数,初始化的全局变量
弱符号--为初始化的全局变量。或者使用__attribute__((weak))申明的变量
处理强弱符号的规则:
1.同一符号多次出现在不同目标文件。编译器报错多次定义
2.一个符号以不同的身份出现在不同目标文件。编译器选择强符号
3.都以弱符号出现在不同目标文件。编译器选择占用内存大者
3.强引用:目前对外部模块的引用,都是强引用,如果在强引用下,没有找到该符号,编译器
报错在链接的时候
4.弱引用:可以通过__attribute((weakref))来指定,如果在链接查找弱引用符号的时候,
并没有找到。编译器会将其自动初始化为0或者其他值。不会报错。
结论:
1.强弱符号对于写程序变量的初始化特别的重要。
2.强弱引用可以用来实现模块与用户程序的简单重载???
阅读(839) | 评论(0) | 转发(0) |