c宏功能中的括号

时间:2017-08-17 08:21:30

标签: c gcc macros parentheses

我有这个宏定义:

#ifdef DEBUG
#define DEBUG
#endif
#ifdef DEBUG
#define DEBUG_SNAP(format) snap format
#else
#define DEBUG_SNAP(format)
#endif

并且像

一样调用它
DEBUG_SNAP( ( "Value1", "Value2", "Value3" ) )

这是代码我有分析,我不允许改变。

问题是gcc c编译器抱怨:它是用一个参数定义的,但它是用三个参数调用的。我可以理解,目的是使用一个参数,在这种情况下看作整个表达式( "Value1", "Value2", "Value3" )

允许更改代码,但我可以使用C预编译器选项。

问题:gcc C预编译器中是否有一些选项使其理解像(P1,P2,P3)这样的表达式实际上是一个参数值,而不是三个参数?

以下是示例代码。 我有一个名为debug.h的头文件,含有此内容

#ifdef DEBUG
#define DEBUG
#endif
#ifdef DEBUG
#define DEBUG_SNAP(format) snap format
#else
#define DEBUG_SNAP(format)
#endif

我有这个带有此内容的C文件calldebug.c

#include "debug.h"

extern snap (char *parm1, char *parm2, char *parm3);
void func
{
    DEBUG_SNAP("parm1", "parm2", "parm3");
}

gcc预编译器返回错误

错误:宏“DEBUG_SNAP”传递了3个参数,但只需1个

更多信息:

  1. 这是最初使用UC编译器的Unisys 2200环境中的C代码。
  2. 这是在Windows中运行的分析项目。更改代码与分析意图相反,即分析现有代码而不是修改代码。
  3. 我希望能够保持代码不变,只使用gcc预编译选项来解决问题。

1 个答案:

答案 0 :(得分:1)

您的示例代码未能使用第二对括号。它必须是:

DEBUG_SNAP(("parm1", "parm2", "parm3"));

<强>不

DEBUG_SNAP("parm1", "parm2", "parm3");

这是问题的原因。

除此之外:

#ifdef DEBUG
#define DEBUG
#endif

什么都不做。你可以删除它。你应该在extern snap (char *parm1, char *parm2, char *parm3);中指定一个返回类型(extern关键字实际上有一个注释 - 你也可以删除它。)

如果您无法触及代码,则可以使用命令行选项覆盖变量宏debug.hDEBUG_SNAP(...) snap(__VA_ARGS__)的{​​{1}}标头。然后你不需要第二对括号。