如果我在多次包含的头文件中定义一个大的常量字符串,它是否会在可执行文件中创建常量字符串的多个副本? (如果确实如此,有没有办法避免这种情况而不需要单独的源文件?)
这是标题的样子:
#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] = {...};
答案 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