不要在头文件中定义变量
2012-10-23 14:59
169 查看
在写C代码的时候,经常需要在头文件中包含有些预定义的信息。比如一些结构体的声明,外部变量,函数的声明等。
有时候觉得有必要在头文件中定义一些变量,这样在源文件中就不需要定义了。但是这样做,有很大的问题。
比如
cc -c -o main.o main.c
cc -c -o test.o test.c
gcc main.o test.o -o test
test.o:(.data+0x0): multiple definition of `x'
main.o:(.data+0x0): first defined here
test.o:(.data+0x4): multiple definition of `name'
main.o:(.data+0x4): first defined here
collect2: ld returned 1 exit status
make: *** [all] 错误 1
你或许会认为,x我没有在其他地方定义啊!字符串name也是一个常量,怎么就会报重复定义呢?
其实,在test.c中包含了test.h,里面定义了x和name,main.c中也是这样。于是在链接的时候,不知道该用哪一个定义了。
正确的做法应该是只在头文件中声明,而真正的定义放到源文件中,这样不管哪个源文件包含了头文件,都不会有问题,因为定义的地方只有一个,链接的时候会找到的。
如果你真的认为很有必要在头文件中进行定义变量,那么就在前面加上static吧。起码可以保证你编译,链接的时候不出错。
有时候觉得有必要在头文件中定义一些变量,这样在源文件中就不需要定义了。但是这样做,有很大的问题。
比如
//test.h 1 #ifndef _TEST_H 2 #define _TEST_H 3 int x; 4 const char *name = "hhcn"; 5 #endif ~
//test.c #include "test.h"
//main.c 1 #include <stdio.h> 2 #include "test.h" 3 4 int main() 5 { 6 int j = x; 7 printf("j= %d\n", j); 8 9 const char *p = name; 10 printf("%s\n", p); 11 12 return 0; 13 } ~这样,编译的时候,都通过了,但是链接的时候,会报
cc -c -o main.o main.c
cc -c -o test.o test.c
gcc main.o test.o -o test
test.o:(.data+0x0): multiple definition of `x'
main.o:(.data+0x0): first defined here
test.o:(.data+0x4): multiple definition of `name'
main.o:(.data+0x4): first defined here
collect2: ld returned 1 exit status
make: *** [all] 错误 1
你或许会认为,x我没有在其他地方定义啊!字符串name也是一个常量,怎么就会报重复定义呢?
其实,在test.c中包含了test.h,里面定义了x和name,main.c中也是这样。于是在链接的时候,不知道该用哪一个定义了。
正确的做法应该是只在头文件中声明,而真正的定义放到源文件中,这样不管哪个源文件包含了头文件,都不会有问题,因为定义的地方只有一个,链接的时候会找到的。
如果你真的认为很有必要在头文件中进行定义变量,那么就在前面加上static吧。起码可以保证你编译,链接的时候不出错。
相关文章推荐
- 转载 永远不要在.h文件中定义变量!
- 变量一般不要定义在.h文件中
- 永远不要在.h文件中定义变量----->转载一篇博客
- 变量一般不要定义在.h文件中
- 头文件中不要去定义函数与变量
- 编写安全代码:不要在头文件中定义变量
- 变量一般不要定义在.h文件中
- C语言中尽量不要在头文件中定义变量
- 最好不要在头文件里面包含定义变量
- 【自我修养】不要嘻嘻哈哈的在头文件中定义变量
- 编写安全代码:不要在头文件中定义变量
- c++ 变量不要定义在.h 头文件当中(main already defined in *.obj 解决方法)
- opencv学习(四)头文件申明/main函数格式定义/程序(变量)命名规则/printf函数
- 程序文件【C/C++】变量的定义与声明
- C++ error LNK2005,某变量已经在*.obj文件中定义了 解决方法
- 关于头文件定义全局变量等问题
- 关于头文件中为什么定义的变量用extern关键字
- 查找系统定义size_t , va_list , va_start , va_end 等不常见宏(变量)头文件所在
- 实用编程技术之多个头文件中变量的重复定义
- 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法!