gpt4 book ai didi

c - 是否可以防止 C 中宏的重复、相同参数?

转载 作者:行者123 更新时间:2023-12-04 09:26:35 25 4
gpt4 key购买 nike

有某些罕见的情况,它可能有助于防止宏的重复参数。

拿这个ELEM(value, ...)宏,

检查 value 是否为 ABC

if (ELEM(value, A, B, C)) { .... }

有些人可能会不小心多次传入同一个参数,例如:

if (ELEM(value, A, B, B)) { .... }

虽然有效的 C,但几乎可以肯定是意外,并且极不可能是开发人员的意图。

...这当然是一个微不足道的例子,实际的错误情况会更复杂。

问题

有没有办法让编译器在传入重复参数时发出警告/错误


澄清:

  • 参数不是必须所有常量(它们也可以与变量混合)。

注释...

  • 之所以提问,是因为这是我最近在某些代码中发现的实际错误。
    虽然宏/编译器可以防止错误,但如果宏不允许,这可能会及早检测到
    当然应该在代码审查中发现这些类型的错误...
    然而,错误还是会发生。

  • 这可能需要使用一些 GCC/编译器特定的扩展,例如 __builtin_constant_p

  • 一种方法可以做到这一点(这不是万无一失的,但可以帮助避免一些错误),可能是将标识符转换为字符串,然后在任何标识符完全匹配时进行静态断言。
    具有明显的缺点,即不同的标识符可能表示相同的常量值。同样的标识符也可以写成不进行比较,例如:A[0] vs A[0]

  • 如果预处理器/编译器不能轻易做到这一点,后备解决方案可能是使用一些基本的静态检查工具。

最佳答案

尝试以下操作,不确定这是标准 C 还是 gcc 扩展。

#define MAC(a,b,c) _Static_assert(a != b, "must not be equal to b")

int main()
{
MAC(2,1,0);
MAC(1,1,0);
}

编辑:这是 C11 标准的一部分,您也可以使用 assert.h 中定义的 static_assert

关于c - 是否可以防止 C 中宏的重复、相同参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31631862/

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