我有这个宏定义:
#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个
更多信息:
答案 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.h
或DEBUG_SNAP(...) snap(__VA_ARGS__)
的{{1}}标头。然后你不需要第二对括号。