C ++期望的类型说明符错误

时间:2009-09-29 12:41:28

标签: c++ c

我正在尝试编写一个包装函数来确定谁在调用特定函数。所以在.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 [] 。任何想法如何解决这类问题,而不破坏更多的代码

2 个答案:

答案 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