我有一个头文件,其中包含基于用户操作系统的功能,它使用:
#ifdef _WIN32 // Windows
...
#else // Linux/Unix code (I know it will be either Windows or Linux/Unix)
...
#endif
当前在运行时从main
调用在其相应块中定义的函数并存储一个常量,但这使我想到:我可以在编译时在标头中计算此常量吗?
类似的东西:
#ifdef _WIN32
// function here; call it foobar()
#define WINCONST foobar()
#else
// function here; call it xfoobar()
#define NIXCONST xfoobar()
#endif
但是,我不确定您可以在#define
预处理程序指令中使用函数调用。我知道您可以使用#define ADD(x, y) (x + y)
之类的方式使用它,仅此而已。
答案 0 :(得分:3)
类似的东西:
constexpr uint32_t foo()
{
// complex calculations...
return 0;
}
uint32_t const SomeConstant = foo();
旁注:foo
将被评估为编译时间常数,只要不传递任何非编译时间参数,因此上面的定义也将产生一个编译时间常数(等效于uint32_t SomeConstant = 7;
)。但是,如果您从foo
中删除constexpr限定符,则代码不会中断,除非您在需要编译时间常数的地方使用该常数(例如,数组定义)。这可能是不希望的,在后一种情况下,constexpr
提供了更强的保证(即,只要foo(/*...*/)
的编译时间不是恒定的,编译就会失败):
uint32_t constexpr SomeConstant = foo();