我正在尝试编写一个包装函数来确定谁在调用特定函数。所以在.h文件中我添加了以下内容:(以及.cc文件中的实现)
extern int foo(/*some arguments*/);
extern void call_log(const char*file,const char*function,const int line,const char*args);
#define foo(...) (call_log(__FILE__, __FUNCTION__, __LINE__, "" #__VA_ARGS__), foo(__VA_ARGS__))
但是,我收到以下错误:
error: expected a type specifier
(call_log(__FILE__, __FUNCTION__, __LINE__, "" #__VA_ARGS__),foo(__VA_ARGS__)
假设使用一些参数调用 foo 函数并返回一个int。
编译器是gcc 3.4
由于
修改
删除“。”和额外的间隔,但问题仍然存在。谁能看到可能导致它的原因。另请注意我使用的是可变参数宏 - 我的编译器支持(c99)
编辑2 只是为了得到关于我非法使用某些c / c ++结构的说法。下面的代码有效,我正在尝试将其改编为我当前的(上面的函数)
#include <stdio.h>
int funcA( int a, int b ){ return a+b; }
// instrumentation
void call_log(const char*file,const char*function,const int line,const char*args){
printf("file:%s line: %i function: %s args: %s\n",file,line,function,args);
}
#define funcA(...) \
(call_log(__FILE__, __FUNCTION__, __LINE__, "" #__VA_ARGS__), funcA(__VA_ARGS__))
// testing
void funcB()
{
funcA(7,8);
}
int main(void){
int x = funcA(1,2)+
funcA(3,4);
printf( "x: %i (==10)\n", x );
funcA(5,6);
funcB();
}
编辑3
正如litb所指出的那样,问题实际上是由于宏观替代。我还注意到foo不仅是一个函数调用,而且在某些情况下也用作 ptr-&gt; foo [] 。任何想法如何解决这类问题,而不破坏更多的代码
答案 0 :(得分:1)
找出错误的最佳方法是使编译器显示预处理的代码。然后,您可以更容易地发现违规行中的问题。
答案 1 :(得分:0)
如果我没弄错,我相信你在call_log的定义和声明中有很多语法错误。
在定义中我很确定你需要const char *和变量名之间的空格。即...
extern void call_log(const char * file,const char * function,const int line,const char * args);
另外,在声明中,我认为你不能以你正在做的方式将#__VA_ARGS__追加到“”。宏将解析为:
(call_log( file_name , function_name , line _#,“” arg1,arg2 ... ) ,foo( args [] )
这不是有效的函数调用。另外,在宏定义之后,您还缺少分号。
最后,我没有在宏定义中看到对foo(args)的引用;我可能错过了某些背景信息,但你也可能希望看一下。
希望这会有所帮助......
CJ