gpt4 book ai didi

c - 计算结果为零并可用作语句的函数宏

转载 作者:太空狗 更新时间:2023-10-29 17:11:22 26 4
gpt4 key购买 nike

我们有一个函数宏 #define FOO(arg) foo(arg)int foo(const char* bar);。当定义 NDEBUG 时,FOO 被定义为 #define FOO(arg) 0,但这会导致许多编译器警告,因为在许多情况下 FOO 的返回值未被使用。该解决方案应与 ANSI C 编译器一起使用并且不会引起警告。我试过:

(void)0: 不能赋值给变量

static int foo(const char* bar) { 返回 0; : 在某些模块中导致未使用的静态函数警告

static inline int foo(const char* bar) { return 0; :仅适用于 C99 编译器

感谢您的帮助!

编辑1:它有点像跟踪宏,并在整个项目中使用。大多数情况下它只是用作像 FOO("function x called"); 这样的语句,但在少数情况下我看到了 if (FOO("condition a")) {/* 更多调试输出 */。在定义了 NDEBUG 并启用了优化后,FOO 不应留下任何东西。这不是我想出来的,但我必须清理这个烂摊子 :)。

edit2:我应该补充说,对于 gcc 发布版本,使用了这些标志:-O3 -Wall -ansi

edit3:现在我要使用 __inline int dummy() { return 0; }。 __inline 在 ansi 模式下与 VisualC 和 GCC 一起工作。

最佳答案

猜想它有点依赖于编译器,但这应该可行:

#ifndef NDEBUG
#define FOO(arg) foo(arg)
#else
#define FOO(arg) ((int)0)
#endif

它防止“表达式无效”警告,它什么也不做,使用时它的值仍然是 0。

已编辑
它似乎不是那么便携所以(现在)你有这些条件:

  • (0)((int)0) 至少适用于 VC 2010。
  • __noop 应该可以在 2003 之后的任何版本的 VC 上工作。

VC6 不是问题,因为它根本不会发出 C4555 警告。对于您可能使用的其他编译器:

  • ((void)0, 0) 它可能适用于很多编译器(也许它是更便携的?)。
  • 内联 int foo(const char* bar) { return 0; } 适用于任何其他 C99 编译器(如您所写,您可能需要在 gcc 上将其声明为 static)。

对于任何其他史前 C 编译器,使用@Jobs 指出的解决方案:abs(0)

关于c - 计算结果为零并可用作语句的函数宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10190701/

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