gpt4 book ai didi

c++ - 在编写平台相关代码时使用 constexpr if 而不是宏?

转载 作者:可可西里 更新时间:2023-11-01 18:38:58 26 4
gpt4 key购买 nike

现在 if constexpr 是 C++17 的一部分,在编写平台相关代码和类似代码时,它是否是宏的良好替代品?

我想知道,因为我真的不喜欢宏,并且只想将它们用于 include guards 和 includes。

// 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";
}

代替当前的解决方案:

void print_os() {
#ifdef _WIN32
std::cout << "You're on Windows!\n";
#elif __linux__
std::cout << "You're on a Linux OS!\n";
#elif __APPLE__
std::cout << "You're on Mac OS!\n";
}

这两种方式在编译时都不会为其他平台生成代码,因此它们在技术上是相同的,因此,我更喜欢 constexpr 方式(如果可能的话)。

这是否是编译器从上面实现 constexpr 变量的可行请求?我找不到 gcc 和 clang 的任何功能请求和实现,所以他们不想实现第一种方式一定是有原因的。为什么会这样?

最佳答案

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

if constexpr 只是一个不实例化废弃分支的工具。而已。这意味着代码如下:

void draw() {
#if LINUX
ncursesDrawWhatever();
#elif WINDOWS
Win32Draw();
#endif
}

(现在完全没问题)不等同于:

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

因为在两个平台上这两个函数都需要可用(而在预处理器版本上它们不可用)。在这种情况下,constexpr 是完全多余的,因为它什么都不做。必须在两个平台上为一个未使用的函数定义两个函数有点痛苦,这就是为什么首先以这种方式使用预处理器的原因!

关于c++ - 在编写平台相关代码时使用 constexpr if 而不是宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42596975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com