C++ 在编写与平台相关的代码时,是否使用constexpr if而不是宏?

C++ 在编写与平台相关的代码时,是否使用constexpr if而不是宏?,c++,c++17,C++,C++17,既然如果constexpr是C++17的一部分,那么在编写与平台相关的代码和类似代码时,它是否是宏的良好替代品 我想知道,因为我真的不喜欢宏,只想将它们用于include-guard和include // those variables should be given by the compiler constexpr unsigned int __os = 0x1; // current os constexpr unsigned int __os_win = 0x1; // Windows

既然
如果constexpr
是C++17的一部分,那么在编写与平台相关的代码和类似代码时,它是否是宏的良好替代品

我想知道,因为我真的不喜欢宏,只想将它们用于include-guard和include

// those variables should be given by the compiler
constexpr unsigned int __os = 0x1; // current os
constexpr unsigned int __os_win = 0x1; // Windows
constexpr unsigned int __os_linux = 0x2; // Linux-flavors
constexpr unsigned int __os_apple = 0x4; // Mac os

void print_os() {
    if constexpr (__os == __os_win)
        std::cout << "You're on Windows!\n";
    else if constexpr (__os == __os_linux)
        std::cout << "You're on a Linux OS!\n";
    else if constexpr (__os == __os_apple)
        std::cout << "You're on Mac OS!\n";
}
//这些变量应该由编译器给出
constexpr unsigned int _os=0x1;//当前操作系统
constexpr unsigned int\uuuu os\u win=0x1;//窗户
constexpr unsigned int _os_linux=0x2;//Linux风格
constexpr unsigned int _os_apple=0x4;//苹果操作系统
作废打印_os(){
如果constexpr(\uuuuos==\uuuuuuos\uwin)

std::cout我同意,使用C语法而不是ifdef更具可读性。为了向后兼容,您可以使用编译标志或pragma来禁止对const条件的警告。Constexpr作为关键字可能比相同效果的注释更有用。

可能是因为您还没有编写过。这些都是相当新的东西像这样的想法需要时间来过滤到实际实现的代码和事情完成方式的变化

例如,我浏览了Python
asyncio
包,尽管在专门支持此包用例的语言中创建了
async
Wait
关键字,但它在很少的地方使用了它们,在大多数地方仍然使用了
@coroutine
装饰器。这并不太令人惊讶上升


因此,发布该功能请求。要求提供一些不错的操作系统测试常量,这些常量可以与
constexpr
条件一起使用。或者甚至可以承诺自己去挖掘库来实现它们。该功能还不到2年。因此,还没有完成这项工作也就不足为奇了。

我现在发布这个问题一年后知道为什么这不是一个好主意。这是因为两者实际上并不等同

如果constexpr
只是一个工具,它不会实例化被丢弃的分支。就是这样。这意味着类似以下代码:

void draw() {
#if LINUX
    ncursesDrawWhatever();
#elif WINDOWS
    Win32Draw();
#endif
}
(目前还可以)不等同于:

void draw() {
    if constexpr (__linux)
        ncursesDrawWhatever();
    else if constexpr (__win)
        Win32Draw();
}

因为在这两种平台上,这两个函数都需要可用(而在预处理器版本上则不需要)。在这种情况下,
constepr
是完全冗余的,因为它什么都不做。在两个平台上定义两个函数只是为了一个没有被使用是有点痛苦的,这就是为什么预处理器最初是以这种方式使用的!

乍一看,它听起来像是向后的。这对于include gua来说是可行的rds,但是您可以在命令行(make文件)上定义它们吗?我想您可以在命令行中选择单独的文件夹:windows/config.h、apple/config.h(以及例如-I windows)但这似乎比命令行定义的通用性要差得多。也许代码中shell变量的编译时评估?可移植吗?我想到的第一件事是向后兼容性…@W.F.为什么?我不是建议用另一种方式替换宏方式。@Raket1111 Ohh,对……所以你想同时使用定义和常量expr变量?但如果constexpr
,您仍然可以使用
中定义的常量,不是吗?..@raket1111您计划如何在编译过程中注入
\uuuu os
?问题是为什么没有功能请求?如果不需要功能——编译器也不需要它——那么这就是一个显而易见的原因为什么不会有任何要求。这不需要对没有提出此类要求的人进行投票来回答海报的问题。这是我的预处理器。有很多类似的,但这是我的。我的预处理器是我的朋友。
void draw() {
    if constexpr (__linux)
        ncursesDrawWhatever();
    else if constexpr (__win)
        Win32Draw();
}