在编译时设置静态常量值(不是由预处理器)

时间:2014-04-02 18:49:29

标签: c++ c++11 static compilation

只是简短的问题。 我可以在编译时使用-D的{​​{1}}标志来定义预处理程序变量。但有没有办法以这种方式设置常量常量变量的值?

我想避免预处理器。我没有看到任何理由,为什么这是不可能的。

3 个答案:

答案 0 :(得分:6)

好吧,您无法从编译器开关定义变量。你可以伪造它:

const int my_cli_defined_variable = MY_CLI_DEFINED_VARIABLE
#undef MY_CLI_DEFINED_VARIABLE

然后:

g++ -DMY_CLI_DEFINED_VARIABLE=5 …

第二行将确保实际代码不会意外使用预处理器宏,因为宏将不再存在。因此,使用此CLI定义变量的唯一方法是通过const变量以类型安全的方式。

在未定义宏时处理情况的完整示例:

const int my_cli_defined_variable = 
#ifdef MY_CLI_DEFINED_VARIABLE
    MY_CLI_DEFINED_VARIABLE;
#undef MY_CLI_DEFINED_VARIABLE
#else
    42;
#endif

答案 1 :(得分:2)

你可以这样做:

#include <iostream>

#if defined MYCONST_VAL
static const int MYCONST = MYCONST_VAL;
#else
static const int MYCONST = 3;
#endif

int main(int argc, char** argv) {
  std::cout << MYCONST << std::endl;
  return 0;
}

这有效:

$ clang++ preproc.cc 
$ ./a.out 
3
$ clang++ -D MYCONST_VAL=77 preproc.cc 
$ ./a.out 
77

虽然有点难看。我不建议这样做。

答案 2 :(得分:1)

如果您只有一小组值(或者您不介意拥有大量小文件),您可以使用适当的初始化程序编写一组包含变量定义的头文件,然后包含想要使用-include选项。

但请注意,在包含文件时,无论是在源代码中使用#include还是使用g ++的-include选项,您都会使用预处理器,因此您将无法使用为了避免这种情况。

例如,您可能有一个包含行

的头文件8bit.h
int const bit_size = 8;

和包含该行

的另一个头文件16bit.h
int const bit_size = 16;

然后使用

编译源代码
g++ foo.cc -include 8bit.h