当我尝试使用以下声明包含库时,任何人都知道为什么这不起作用:
namespace wincabase
{
const char* SOMESTRING = "xx";
}
虽然这很好:
namespace wincabase
{
const int X = 30;
}
当我链接lib时,第一种情况下gcc出现“多个定义”错误。谢谢!
答案 0 :(得分:5)
const char *表示指向const char的指针。这意味着指针本身不常量。
因此它是一个普通变量,所以你需要使用
extern const char* SOMESTRING;
头文件中的和
const char* SOMESTRING = "xx";
在库的一个编译单元中。
或者,如果它是一个指向const char的 const 指针,那么你应该使用:
const char* const SOMESTRING = "xx";
答案 1 :(得分:2)
您将指针声明为const,然后将其指向编译单元中定义的字符串文字,因此如果您在头文件中使用此字符串,则会复制字符串文字。您需要做的是在头文件中声明指针,并在库中的源文件中定义字符串。
部首:
extern const char* SOMESTRING;
在库中的某个源文件中:
const char* SOMESTRING = "xx";
答案 2 :(得分:2)
除了托比指出的方法:
const char* const SOMESTRING = "xx";
另一种方法是将其声明为 const 字符数组:
const char SOMESTRING[] = "xx";
这种方法可能为编译器提供额外的优化机会,例如将字符串放在生成的二进制文件的只读部分中;虽然可以想象编译器可能能够使用第一种方法执行类似的优化。
答案 3 :(得分:1)
您需要分别声明和定义它们:
Plop.h
======
namespace wincabase
{
extern const char* SOMESTRING; // declare
}
Plop.cpp
========
const char* wincabase::SOMESTRING = "xx"; // define