如何在 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_APARAM_Z 声明为 const,然后在 Parameter.cpp 中将它们定义为 constexprconstconstexpr 是不同的东西。在 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#TS和Dart对比3:编译时常量和运行时常量

如何从 C 调用在 MATLAB 中创建并在 C 中编译的函数?

如何在类属性的Objective C中创建类似json的结构?

如何在编译时获取数组大小?

如何在目标 c 中创建 BOOL 实例变量?

什么是哈希表以及如何在 C 中创建它? [关闭]