"multiple definition of" 错误
在global.h定义了一个常量字符串,在多个cpp中包含该global.h.
// file: global.h
#ifndef GLOBAL_H
#define GLOBAL_H
const char * STR_TEST = "Hello world!";
#endif
结果链接时出现错误:
multiple definition of ‘STR_TEST’
虽然改为#define肯定行,但是尽量应该用const量取代宏定义。
这里有个概念性错误。
const 变量默认是 static 的,
但带有 const 的不一定是 const 变量.
此处 STR_TEST 并不是常量,而是指向常量字符串的变量。
改为
const char * const STR_TEST = "Hello world!";
就可以了。
不过我又觉得改为
const char STR_TEST[] = "Hello world!"
更好。
阅读(5349) | 评论(0) | 转发(0) |
评论
前面那个const可以去掉的 效果一样的 回复 更多评论
const int a = 12; 表示a 是个常量
const char * STR_TEST = "Hello world!";表示STR_TEST指向的内容是常量,但其本身(作为一个指针变量而言)不是一个常量。
所以:
char * const STR_TEST = ".." 即可
char * const STR_TEST = "Hello world!";
STR_TEST[0] = 'X';
会通过编译,所以不能去掉前面的const.
multiple definition并不是由其constness不正确而导致的。
char * const p = "....";(p为常量,存放在常量表中,链接时没问题)或者static char * p = "....";(限制p的作用域为编译单元,但p可修改)即可,因为字符串本身是字面常量,不能修改。
因此,你这里的错误是由于全局变量使用错误导致的,与const无关。按照你最初的定义,在多个cpp中包含该global.h就相当于多次定义了STR_TEST。因此链接时会出错。
const char STR_TEST[] = "Hello world!";这里有个拷贝操作,相当于多用了一倍的空间。
建议你看看“C++:一些基础知识”(http://blog.chinaunix.net/u/12783/showart_548200.html)3和4条
#ifndef GLOBAL_H
#define GLOBAL_H
#endif
还出现重复定义?不解中……
会有运行时错误的这位大哥
这个防护宏只能防止一个cpp里重复包含
IMHO,你们对于变量的定义理解存在问题。参考“C/C++:如何理解复杂的声明”(http://blog.chinaunix.net/u/12783/showart_378340.html)。
变量定义一次就分配一次存储。多次包含global.h,则多次为STR_TEST分配空间。编译器正常是因为分开编译。链接异常是因为有多个存储叫做STR_TEST,通过STR_TEST引用存储存在二义性。
而且inclusion guard是防止一个h被重复包含,而不是在一个cpp里重复包含。最基础的书籍关于这点也是很清楚的。
与inclusion guard无关。
你没有理解博主的意思。
IMHO,其他人该好好巩固一下基础了。
看了你的文章,很好,学到了 bitwise constant.
const char STR_TEST[] = "Hello world!";
确实多用了空间, 看来还是用 const char * const 好,这样只需复制指针。
const 变量默认是 static,应该是C++标准说的吧。不然我的代码就会编译出错。
c++标准哪里有?把原话贴过来啊。
void foo()
{
int const a = 10;
a++;
}
如果const默认是static,那么上面的函数应该等价于:
void foo()
{
static int a = 10;
a++;
}
可能吗?
void foo()
{
int const a = 10;
}
如果const默认是static,那么上面的函数应该等价于:
void foo()
{
static int a = 10;
}
可能吗?
更准确的说法可能是:C++中const默认为内部链接的。
我本来不甚了了,现在查了C++标准终于清楚了。
C++ 2003 标准下载自:
原文如下:
Annex C
3.5
Change: A name of file scope that is explicitly declared const, and not explicitly declared extern, has internal linkage, while in C it would have external linkage
Rationale: Because const objects can be used as compile-time values in C + +, this feature urges programmers to provide explicit initializer values for each const. This feature allows the user to put const objects in header files that are included in many compilation units.
This feature allows the user to put const objects in header files that are included in many compilation units.
的确无知了,不知道const还有这个用法,惭愧惭愧