繁体   English   中英

同时声明和定义C ++数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM