检测预处理器 #if 中不适当的变量用法

Detect inappropriate variable usage within preprocessor #if

提问人:Kumputer 提问时间:10/5/2023 更新时间:10/5/2023 访问量:50

问:

请考虑以下任意但过于简化的代码:

#define CONST_BAR 2

int foo(int x)
{
#if CONST_BAR > 0
    return x * CONST_BAR;
#else
    return x;
#endif
}

假设我们在多个文件中有许多代码块,这些代码块引用了类似预处理器指令中的CONST_BAR。我想将CONST_BAR重构为一个。问题是,如果我未能成功发现所有以类似方式引用的预处理器指令,我的代码将突然在所有地方都出错:constexpr intCONST_BAR

constexpr int CONST_BAR = 2;

int foo(int x)
{
#if CONST_BAR > 0
    return x * CONST_BAR;
#else
    return x;
#endif
}

问题是我使用的编译器(MSVC、clang)都没有发出明显错误使用的错误或警告,并且预处理器指令实际上会计算为 false,从而改变我的函数的行为,而这不是我的意图。我真的打算如下:#if CONST_BAR > 0

int foo(int x)
{
    if constexpr (CONST_BAR > 0)
    {
        return x * CONST_BAR;
    }
    return x;
}

如何让编译器将其识别为错误,以便我可以纠正它?

C++ 预处理器 if-constexpr

评论

2赞 Igor Tandetnik 10/5/2023
首先,让它.这将在任何地方触发错误。修复这些错误,然后将宏更改为变量。#define CONST_BAR !#if CONST_BAR > 0
0赞 Kumputer 10/5/2023
合理,但我希望有更好的方法。IRL 我已经更改了 30 个左右 #defines 类似的。我宁愿不一一去,而且我想正确的用法也不会编译。
0赞 Igor Tandetnik 10/5/2023
回复:正确用法。临时命名变量或其他名称。做坏的宏技巧来找到坏的宏用法,并用好的变量用法替换。然后删除宏,重命名变量,并将变量的用法更新为新名称。忘记更新的任何地方都会触发编译器错误。CONST_BAR_X
0赞 Kumputer 10/5/2023
实际上,到目前为止,我发现的最简单的事情是在“在文件中查找”中使用正则表达式,并将所有以前的宏包含在表达式 #.+(CONST_BAR|CONST_BAR_2|CONST_BAR_3...等等)
0赞 Harsh patel 10/5/2023
您可以在使用 之前检查宏是否存在,以避免错误的评估#ifdef CONST_BAR#if#if

答: 暂无答案