[英]Declaring and defining C++ arrays at the same time
我同时尝试定义和声明一些全局C ++常量:
: 在 :
#ifdef DEFINE_CONSTANTS
#define DECLARE_CONSTANT(DECL_, VAL_) extern DECL_ = VAL_
#else
#define DECLARE_CONSTANT(DECL_, VAL_) extern DECL_
#endif
namespace Constants {
DECLARE_CONSTANT(const char LABEL[], "SomeText");
DECLARE_CONSTANT(const int REQUEST_TIMEOUT_MS, 5000);
};
: 在 :
#define DEFINE_CONSTANTS
#include "constants.h"
#undef DEFINE_CONSTANTS
在所有其他使用常量的文件中,我只包含
现在,如果我不使用数组初始值设定项,上述方法就可以正常工作。 但是,当我尝试执行以下操作时:
DECLARE_CONSTANT(const int ARRAY[], {0,1,2});
I get an error since the commas in the initializer "confuse" the preprocessor into thinking that there are too many parameters to DECLARE_CONSTANT (the exact error depends on compiler). 编译时出现错误,因为初始化程序中的逗号“混淆”了预处理器,以为DECLARE_CONSTANT有太多参数(确切的错误取决于编译器)。
有解决这个问题的技巧吗? 也欢迎其他解决方案。
这是因为预处理器非常愚蠢,并且对C或C ++的语法或构造一无所知。 因此,它将{0,1,2}
视为宏的三个不同参数。
您也许可以为此使用可变参数宏 :
#define DECLARE_CONSTANT(DECL_, ...) extern DECL_ = __VA_ARGS__
您正在做的是过早的优化,导致过早的悲观。
这是一种优化,因为常量的内存仅在一个编译单元中分配。 的确是这样,但是对于较小的常量(例如整数),使用变量暗示的指针实际上可能大于常量本身(例如在64位体系结构上!)。
这是一个悲观的说法,因为不能这样使用整数常量,它们是外部常量变量。 它们不会受到持续传播等的影响。您的代码将更大 ,性能也会更差 。
您想要的只是:
const char LABEL[] = "Some text";
const int REQUEST_TIMEOUT_MS = 5000;
那些有本地联系。 是的,如果您在多个地方使用LABEL
,它将在内存中复制,并且可执行文件的strings
转储将显示它。
非预处理器解决方案采用inline
函数,因为它们不受单一定义规则的约束:
inline const char * LABEL() { return "Some text"; }
inline const int * ARRAY() { static const int array[] = {0,1,2}; return array; }
const int REQUEST_TIMEOUT_MS = 5000;
除非您以多个编译单元使用REQUEST_TIMEOUT_MS
的地址,否则这些不会导致重复。
你需要
#define VALUE(...) __VA_ARGS__
然后你可以使用
DECLARE_CONSTANT(const int ARRAY[], VALUE({0,1,2}));
(对于您的具体情况,Joachim的回答更容易,而我的回答更一般)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.