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;//定义

 

原创粉丝点击