在标题中定义一个大的常量字符串?

时间:2017-12-18 17:06:20

标签: c++ header-files compile-time-constant

如果我在多次包含的头文件中定义一个大的常量字符串,它是否会在可执行文件中创建常量字符串的多个副本? (如果确实如此,有没有办法避免这种情况而不需要单独的源文件?)

这是标题的样子:

#pragma once
// this is generated by a tool, so keeping it in one header makes life easy
const uint32 TABLE_SIZE = 65536; 
const uint8 TABLE[TABLE_SIZE] = {...};

2 个答案:

答案 0 :(得分:0)

在C ++中,在文件范围定义的const变量只有内部链接,即它只在该翻译单元中可见。因此,在头文件中定义它不应导致有关多个定义的任何错误。

因此每个include都会生成缓冲区的新副本。

有时你可以在MSVC中为带有选项/GS的const字符串阻止它。但它不适用于像你这样的char数组初始值设定项,仅适用于const char* p = ...

  

如果是,有没有办法避免这种情况而不需要单独的源文件?

不,没有。

答案 1 :(得分:0)

查看stb_image.h如何处理它的头部实现,并找到一种可行的方法,只在可执行文件中包含一次大字符串:

标题现在看起来像这样:

#pragma once

// #define IMPLEMENT_TABLE in one and only one cpp file 
// before including this header to define the table

const uint32 TABLE_SIZE = 65536; 
extern const uint8 TABLE[TABLE_SIZE];

#ifdef IMPLEMENT_TABLE

const uint8 TABLE[TABLE_SIZE] = {...};

#endif