C++:使用const报告链接错误
来源:互联网 发布:mac bt下载工具 编辑:程序博客网 时间:2024/06/13 11:43
今天在用c++写程序的时候,蹦出一个未找到符号的链接错误,都是const惹的祸啊。
在cconst.cpp中有如下代码:
const int bufsize=1024*4;
在consttest中有如下代码:
externconst int bufsize;
intmain()
{
printf(“%d”,bufsize);
}
用vs编译链接,结果蹦出一个如下的链接错误:
出现这种情况我的第一反应就是bufsize没有定义。可我明明在cconst.cpp中定义了啊。(如果把两个文件中的const去掉就没有问题!!)于是我重新用cl命令行(有时候vs这种只能工具只会使问题复杂化)重新将他们各自编译了一下,然后生成相应的obj文件。接下来奇妙的事情发生了。
我用dumpbin查看了一下cconst.obj中的符号表,结果竟然没有发现bufsize!!!如下:
粗略看一下,这里只有4个符号,根本就没有bufsize。也没有数据段。这时候,我才明白,原来编译器根本就没有我的bufsize分配空间。当编译器看到const int bufsize=12时,他要去找变量的声明,不幸的是,他没有找到!于是我加了句extern const int bufsize;就OK了。
最终的ccosnt.cpp源代码如下:
Extern const int bufsize;
Const int bufsize=1024*4;
OK了!!!
可是在第一种情况下,编译器为什么没有为bufsize分配空间呢?
原因有两点: 第一,在cconst.cpp中我没有定义任何函数,这就意味着,没有任何任何代码使用它,而且他又是一个const,而不是普通的变量。所以编译器不会为他分配空间。为了验证这一点,我再cconst.cpp有加入了一个函数,如下:
#include"stdafx.h" const int bufsize=12;void f(){printf("%d",bufsize);int* pi=(int*)&bufsize;*pi=14;printf("%d",*pi);}
这里,我故意用一个指针来指向bufsize,然后修改他!这样就迫使编译器定义bufsize,并且为他分配内存(因为如果不使用指针指向他的话,c++会优化代码,也就是平时所说得常量重叠,最终,编译器不会为他分配内存)。当然了,这段代码如果运行的话肯定会出错,因此bufsize在.rdata段存储,修改他就会蹦出一个内存访问异常。
现在重新编译他,然后查看符号表,如下:
现在已经为bufsize产生定义了,然后重新编译链接整个文件,依然会报告一个链接错误,原因很简单,cconst.obj中的是_bufsize符号,而consttest中引用的却是一个?bufsize@@3HB。他们根本就不匹配!!
第二:C++中, 所有在函数外面定义的const都是私有的,别的文件看不见他!!这时候如果,我们自己的文件也不使用它,那么就以为着没有任何代码使用它。既然如此,编译器理所当然不会为他分配内存。解决办法是用extern修饰,并在定义的时候初始化他,如下:
extern const int bufsize=12;//定义,初始化,分配内存
或者
extern const int bufsize;//声明
const int bufsize=12;//定义
- C++:使用const报告链接错误
- C语言使用const定义数组时的错误原因
- C语言const使用
- C语言const使用
- C/C++ const使用
- [c++]const使用
- 【C++】尽可能使用const
- libcurl 使用 链接错误
- C语言中的CONST使用
- C中CONST的使用
- C中CONST的使用
- C中CONST的使用
- C中CONST的使用
- C中CONST的使用
- C中CONST的使用
- const在C中的使用
- const在C中的使用
- c/c++ const使用心得
- c++反射机制的实现(完整代码,相当靠谱)
- 马云:信任让我成功 让我有了今天(演讲全文)
- 从image/x-png谈文件上传中的ContentType属性
- java中的内部类总结
- C++多重继承汇编分析
- C++:使用const报告链接错误
- EditPlus注册码在线生成
- linux下的僵尸进程处理办法
- 网易面试笔记
- 如何从MyEclipse中删除添加的Hibernate Capabilities
- django ssl
- setCodecForCString setCodecForTr setCodecForLocale
- 像处理数据一样处理代码
- Java基础复习:Object类中的toSting()和equals()方法