多个文件中的常量定义

Drdot

我正在阅读“ 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 constantconst并且会像您期望的那样运行。

更新:

char* const constant另一方面是const指向的指针char作为const它在默认情况下在命名空间范围内在联系。

但是,您不应该使用字符串文字(如编译器警告所指出的那样)对其进行初始化,因为标准不允许这样做(这种转换在c ++ 11中是非法的,并且在此之前已被弃用)。字符串文字被允许存储在只读存储器中,并且您不允许在运行时修改它们。这就是为什么用非指针指向字符串文字const char是危险的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从多个返回值中定义常量

来自分类Dev

如何访问头文件中定义的常量?

来自分类Dev

JavaScript 常量 - 定义多个函数

来自分类Dev

在node.js中定义公共常量文件

来自分类Dev

头文件中定义的常量浮点数**

来自分类Dev

在头文件中定义PHP常量不起作用?

来自分类Dev

在node.js中定义公共常量文件

来自分类Dev

在Laravel中定义常量

来自分类Dev

在PHP中定义常量

来自分类Dev

FXML文件中的常量

来自分类Dev

运行时定义的C ++全局外部常量可在多个源文件中使用

来自分类Dev

头文件中const变量的多个定义

来自分类Dev

头文件中const变量的多个定义

来自分类Dev

Angular-在多个文件中定义模块

来自分类Dev

Scala中的多个常量分配

来自分类Dev

定义多个PHP常量对性能的影响

来自分类Dev

定义多个PHP常量对性能的影响

来自分类Dev

在Apache Avro中定义常量

来自分类Dev

在laravel中定义常量路径

来自分类Dev

在OpenSSL中定义常量BIGNUM

来自分类Dev

在协议中定义NSArray常量

来自分类Dev

在 C 中定义常量数组

来自分类Dev

Swift:模板定义中的常量

来自分类Dev

在头文件中定义变量会导致多个变量定义

来自分类Dev

在C ++中,如何使用在另一个文件中定义的常量变量?

来自分类Dev

仅从当前文件获取定义的常量

来自分类Dev

在XAML文件中使用常量定义DesignWidth

来自分类Dev

在多个cpp文件中包含带有定义的h文件

来自分类Dev

如何在类中包含定义常量的文件(及其作用域)