字符* 常量值 ERROR 与 GNU G++ 编译器
The char* constant value ERROR with GNU G++ compiler
我编写具有以下关系的 sevaral 文件:
文件 A.h:
#ifndef MACRO_HEADER
#define MACRO_HEADER
const char* CONST_CHAR_NAME = "name";
#endif
文件 B.h(B.cpp) 和文件 C.h(C.cpp) 也包含此通用类型定义标头 A.h。当 g++ 最终将 obj 文件合并到 lib 时,它会给出重定义错误。我承认我犯了一个错误,我应该将常量定义为:
const char* const CONST_CHAR_NAME = "name"; //This is OK
但是为什么编译器给我一个重新定义错误?常量字符* 不是常量值吗?但我用 typeid.name 来检查const char *
和cosnt char* const
的类型.它们是相同的:char const * 。我对错误感到困惑。
问题是您在多个位置定义相同的变量名称,即包含 .h 的每个源文件。
通过使用 static
关键字将每个定义声明为源文件的本地定义,可以消除链接器错误:
static const char* CONST_CHAR_NAME = "name";
它给出错误,因为CONST_CHAR_NAME
是在多个"翻译单元"中定义的(翻译单元基本上是单个源文件和所有包含的头文件)。您必须声明它extern
然后在一个源文件中定义常量。
所以在头文件中:
extern const char* CONST_CHAR_NAME;
在一个源文件中:
const char* CONST_CHAR_NAME = "name";
编辑:const char*
和const char* const
之间的区别
宣言
const char* CONST_CHAR_NAME;
创建指向常量字符串的指针。您可以分配给它,只要它指向常量字符串即可。即下面的两行都可以:
CONST_CHAR_NAME = "foo";
CONST_CHAR_NAME = "bar";
另一方面,你有
const char* const CONST_CHAR_NAME;
上面创建了一个指向常量字符串的常量指针。这意味着您无法再次分配给指针,因此上面的两个分配是不行的。
实际上你应该把它声明为:
const char CONST_CHAR_NAME[] = "name";
相关文章:
- 使用 Powershell 命令将 cpp 文件的文件夹编译为 GNU 的 g++
- 如何使用 gnu gcc 标志 -mpc32、-mpc64 和 -mpc80?
- 防止 GNU Make 在每次构建时生成 protobuf 代码
- 为什么 C++ 编译器在"c:program filesgnu emacsinclude"中查找包含文件?
- 有没有适用于Windows.lib文件的GNU二进制文件描述符(BFD)
- 监视GNU Radio中的缓冲区
- GNU C++: unique_ptr.h 没有这样的文件或目录
- MinGW在Cygwin上.关于链接GNU科学图书馆的一些问题
- 与libc相比,Gnu科学图书馆的性能较差
- GNU 在看到其他同名文件时重用源文件
- 从 C++ 调用 GNU 绘图,无需用户输入
- 如何为GSL(GNU科学库)调整C++式随机数引擎?
- 没有规则来设定目标'/usr/lib/x86_64-linux-gnu/libboost_filesystem.so'
- 使用 PYbombs 安装软件包 GNU 无线电时出错
- 在编译时使用 gnu++11 过滤值列表,不使用 stdlib(Arduino 环境)
- Java System.loadLibrary 不会在 /usr/lib/x86_64-linux-gnu/ 文件夹中查
- 在Windows中构建GSL(GNU科学库)以与VS2015一起使用
- _mm512_exp_pd与 GNU 编译器一起使用
- GNU Radio中基于条件的输出的块类型
- 如何重建 GNU Arm 嵌入式工具链的 newlib 和 newlib-nano