代码之家  ›  专栏  ›  技术社区  ›  pstatix

编译时计算头文件中的常量

  •  1
  • pstatix  · 技术社区  · 6 年前

    我有一个包含基于用户操作系统的函数的头文件,它使用:

    #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) 但这就是问题所在。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Aconcagua    6 年前

    类似:

    constexpr uint32_t foo()
    {
        // complex calculations...
        return 0;
    }
    
    uint32_t const SomeConstant = foo();
    

    边注: foo 将被计算为编译时常量,只要没有传递非编译时参数,那么上面的定义也将导致编译时常量(相当于 uint32_t SomeConstant = 7; )但是,如果从 除非使用需要编译时常量的常量(例如数组定义)。在后一种情况下,可能需要或不需要这样做, constexpr 提供更强有力的保证(即每当 foo(/*...*/) 不是编译时间常量):

    uint32_t constexpr SomeConstant = foo();