我正在阅读“ C ++入门指南”。在第9章中,讨论了const修饰符在C ++和C之间的区别:
“在C ++(而不是C)中,const修饰符会略微更改默认存储类。而全局变量默认情况下具有外部链接,而const全局变量默认情况下具有内部链接。
...
如果全局const声明具有与常规变量一样的外部链接,那么这将是一个错误,因为您只能在一个文件中定义一个全局变量。也就是说,只有一个文件可以包含该过程声明,而其他文件必须使用extern关键字提供引用声明。”
我尝试使用以下程序测试此声明:
file.h:
using namespace std;
const char *constant = "Magic";
file1.cpp
#include <iostream>
#include "file.h"
extern void file2();
int main(){
cout << "constant = " << constant << endl;
file2();
}
file2.cpp
#include <iostream>
#include "file.h"
void file2(){
cout << "file2 constant = " << constant << endl;
}
生成文件:
CFLAGS = -Wall -g
INCLUDE = file.h
src = file2.cpp file1.cpp
all: $(src) $(INCLUDE)
g++ $(CFLAGS) -o file $(src)
clean:
rm -f file
当我制作时,出现以下错误信息:
g++ -Wall -g -o file file2.cpp file1.cpp
/tmp/ccdl16Tw.o:(.data+0x0): multiple definition of `constant'
/tmp/ccA3ZEHa.o:(.data+0x0): first defined here
collect2: error: ld returned 1 exit status
make: *** [all] Error 1
gcc版本4.8.2
更新:
如果我做
char* const constant = "Magic";
然后make会给我这个警告:
g ++-墙-g -o文件file2.cpp file1.cpp
In file included from file2.cpp:2:0:
file.h:3:24: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
char* const constant = "Magic";
^
In file included from file1.cpp:2:0:
file.h:3:24: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
char* const constant = "Magic";
const char *constant
不是const
。它是的非const
指针const char
。由于const
在命名空间范围内是不变的,因此默认情况下它具有外部链接,因此会出现多个定义错误。
const char * const constant
是const
并且会像您期望的那样运行。
更新:
char* const constant
另一方面是const
指向的指针char
。作为const
它在默认情况下在命名空间范围内在联系。
但是,您不应该使用字符串文字(如编译器警告所指出的那样)对其进行初始化,因为标准不允许这样做(这种转换在c ++ 11中是非法的,并且在此之前已被弃用)。字符串文字被允许存储在只读存储器中,并且您不允许在运行时修改它们。这就是为什么用非指针指向字符串文字const char
是危险的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句