只是简短的问题。
我可以在编译时使用-D
的{{1}}标志来定义预处理程序变量。但有没有办法以这种方式设置常量常量变量的值?
我想避免预处理器。我没有看到任何理由,为什么这是不可能的。
答案 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