在头文件中定义const字符串数组

时间:2016-01-29 08:28:22

标签: c++ variables const global

我想在全局标题中定义类似的内容:

namespace FruitSaladApp
{
    enum Fruits { Banana, Apple, Orange, Kiwi };
    const char * fruitStrings[] { "Banana", "Apple", "Orange", "Kiwi" };
}

我使用标题保护,以便每个编译单元只定义一次。

我想在枚举旁边保留定义,以避免在添加/删除/修改项目时使它们“不同步”,以便fruitStrings[Banana]连贯且安全。

3 个答案:

答案 0 :(得分:3)

您确实在命名空间内定义了此数组,而不是在全局范围内定义。在数组定义之前添加static关键字,它应该可以工作。

说明: 根据定义,在全局命名空间中声明的const变量是static,因此它们提供了内部链接(它们在其他.cpp文件/翻译单元中不可见)。但是在命名空间内定义的const变量不是static - 这不是必需的,因为命名空间本身限制了它们的可见性。但是当在项目中包含两次或更多这样的头文件时,命名空间内的符号在该命名空间中被声明两次或更多次,这给出了多重定义的错误。

答案 1 :(得分:1)

  

我认为这个问题允许在c ++中对const变量进行多次定义

这个问题以及一般的内部联系意味着你可以在每个多个翻译单元中定义一次

如果在单个翻译单元中多次定义,则仍会出现多个定义错误。解决方案:使用标题保护...由于您声称使用标题保护,因此问题是:不完整的示例,标题保护错误或编译器错误。

答案 2 :(得分:0)

实际上,它需要指针为const,而不是指向的字符

namespace FruitSaladApp
{
    enum Fruits { Banana, Apple, Orange, Kiwi };
    const char * const fruitStrings[] { "Banana", "Apple", "Orange", "Kiwi" };
}

最初的问题已经包含const,但是由于qmake(有时候处理增量构建有些尴尬),一些cpp文件间接地包含了这个头文件没有被重新编译。因此,错误持续存在。

第二个const的效果由MCVE证实