同时声明和定义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);
};
在常量中.cpp:
#define DEFINE_CONSTANTS
#include "constants.h"
#undef DEFINE_CONSTANTS
在使用常量的所有其他文件中,我只包含常量.h
现在,如果我不使用数组初始值设定项,上述方法就可以了。但是,当我尝试执行以下操作时:
DECLARE_CONSTANT(const int ARRAY[], {0,1,2});
编译常量时.cpp我收到一个错误,因为初始值设定项中的逗号"混淆"预处理器认为有太多参数要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}));
(约阿希姆的回答对于你的具体情况更容易,我的回答更笼统)
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '