ITKeyword,专注技术干货聚合推荐

注册 | 登录

全局变量 multiple definition of 问题解决方法

yang_lang 分享于 2011-09-11

推荐:c语言全局变量和局部变量问题及解决汇总

局部变量能否和全局变量重名 如何引用一个已经定义过的全局变量 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?  1、局部变量能否和全局变量重

2019阿里云全部产品优惠券(新购或升级都可以使用,强烈推荐)
领取地址https://promotion.aliyun.com/ntms/yunparter/invite.html

解决方法: 1.给每一个头文件加上条件编译: 注:此方法不是解决上述问题的方法,只是解决multiple definition of的一个方法。 当多个文件包含同一个头文件时,而头文件中没有加上条件编译,就会独立的解释,然后生成每个文件生成独立的标示符。在编译器连接时,就会将工程中所有的符号整合在一起,由于,文件中有重名变量,于是就出现了重复定义的错误。

给每一个头文件加上条件编译,避免该文件被多次引用时被多次解释,这是个应该是习惯。这个方法会解决大部分低级问题。 条件编译示例 #ifndef TEST_H #define TEST_H …… #endif 2.使用extern定义全局变量: 可以把所有的全局变量放入一个头文件 global.h (名字随意起,但要加条件编译)中,每一个变量前面加extern,声明一下这些变量将在其它文件中定义。 然后建立一个和头文件名字对应的.c or .cpp文件 如global.c。在里面声明所有的全局变量。例如:void(*Handl_Display)(); 然后,让涉及到全局变量的文件include ”global.h“。这样编译时,会先对global.c编译生成一个global.o ,然后再和其它文件的.o链接生成可执行文件。 简单一点说,就是在变量前加extern,之后变量的声明放在.c中。 3.使用Static修饰: 在变量前加static,声明成静止变量。 这个方法虽然可以解决multiple definition的问题,但是却会引发其他问题。 问题如下: 三个文件,a.h,a.c,b.c; 在a.c和b.c 都include了a.h。 在b.c中调用a.c中的函数对a.h中的变量进行赋值,但事实上b.c中的变量仍没被赋值。 问题分析: static的含义是迫使那个变量只在某个文件可见。

假定你在头文件定义static x;

且这个头文件分别被a.c和b.c包含; 实质是在a.c和b.c里会分别定义一个名字叫x的变量,两个x毫无关系。 在a.c里修改x,他不会导致b.c里的x变化. 下面附上我的代码测试 *******************************************

推荐:Oracle登陆问题解决方法总结

早上同事用PL/SQL连接虚拟机中的Oracle数据库,发现又报了“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”错误,帮其解决后,发现很多人遇到过这

**************************************************************************** in "test_global.h" #include <iostream> #include <stdio.h> #include <vector> using namespace std; extern vector<int> vec; extern void func(); ******************************** in "test_global.cpp" #include "test_global.h" using namespace std; vector<int> vec; void func(){

vec.push_back(1); } ******************************** in "test_global1.cpp" #include "test_global.h" using namespace std; void func1(){

vec.push_back(2); } ******************************* in "test_global2.cpp" #include "test_global.h" using namespace std; void func2(){

vec.push_back(3); } int main(){

func();

func2();

vec.push_back(6);

for(unsigned int i = 0; i < vec.size(); i++){

cout << vec[i] << endl;

}

return 0; } *******************************

推荐:linux常见问题解决方法之一

l linux网络学习 iftop安装: http://blog.sina.com.cn/s/blog_483e43060101c957.html 网络性能优化简介: http://www.ibm.com/developerworks/cn/linux/l-cn-ne

解决方法: 1.给每一个头文件加上条件编译: 注:此方法不是解决上述问题的方法,只是解决multiple definition of的一个方法。 当多个文件包含同一个头文件时,而头文件中没有加上条件编译,就

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。