如何在 C++11 中创建结构的编译时常量实例
Posted
技术标签:
【中文标题】如何在 C++11 中创建结构的编译时常量实例【英文标题】:How to create a compile time constant instance of a structure in C++11 【发布时间】:2015-04-22 14:52:49 【问题描述】:在我当前的项目中,我正在尝试使用 c++11 创建结构的编译时 const 静态实例。我的代码在 clang(Apple LLVM 版本 6.1.0)中编译并运行良好,但它不适用于 g++(GCC)4.8.3。 GCC 抛出参数未声明为“constexpr”的错误。 有什么办法可以在 gcc 中完成这项工作吗?
//Parameter.h
struct Par
const int uniqid;
const char *name;
const char *description;
constexpr Par(int uid,const char * n,const char * d)
:uniqid(uid), name(n),description(d)
;
class Parameters
const static Par PARAM_A;
...
const static Par PARAM_Z;
printParameters(std::vector<Par> parameters);
;
//Parameter.cpp
constexpr Par Parameters::PARAM_A=0,"-a","Bla a";
...
constexpr Par Parameters::PARAM_Z=0,"-z","Bla z";
void Parameters::printParameters(std::vector<Par> parameters)
for (size_t i = 0; i < parameters.size(); i++)
switch (parameters[i].uniqid)
case PARAM_A.uniqid:
std::cout << "A" << std::endl;
break;
GCC 如下:
Parameters.cpp:11:39: error: declaration of ‘const Par Parameters::PARAM_A’ outside of class is not definition [-fpermissive]
Parameters.cpp:12:39: error: redeclaration ‘Parameters::PARAM_A’ differs in ‘constexpr’
constexpr Par Parameters::PARAM_A=...;
In file included from Parameters.cpp:2:0:
Parameters.h:190:34: note: ‘Parameters::PARAM_A’ was not declared 'constexpr' const static Par PARAM_A;
【问题讨论】:
请复制exact错误信息。此外,请先修复您的语法错误。 @user2079303 我添加了错误并删除了一些拼写错误。现在是否足以理解问题? FWIW,GCC 4.9 接受这个。 【参考方案1】:我认为问题在于您在 Parameter.h 中将 PARAM_A
和 PARAM_Z
声明为 const
,然后在 Parameter.cpp 中将它们定义为 constexpr
。
const
和 constexpr
是不同的东西。在 Parameter.cpp 你必须有这样的东西:
//Parameter.cpp
const Par Parameters::PARAM_A=0,"-a","Bla a";
...
const Par Parameters::PARAM_Z=0,"-z","Bla z";
【讨论】:
以上是关于如何在 C++11 中创建结构的编译时常量实例的主要内容,如果未能解决你的问题,请参考以下文章
如何从 C 调用在 MATLAB 中创建并在 C 中编译的函数?