错误C2660:函数不接受X参数

时间:2016-08-27 08:34:08

标签: c

我正在将一些遗留的C代码转换为C ++。

头文件包含宏P

#ifndef P
# ifdef __STDC__
#  ifndef __HIGHC__
#   define USE_ANSI_PROTOTYPES
#  endif
# endif
# ifdef __sgi__
#  define USE_ANSI_PROTOTYPES
# endif

# ifdef USE_ANSI_PROTOTYPES
#  define P(s) s
# else
#  define P(s) ()
# endif
#endif

在我的情况下,USE_ANSI_PROTOTYPES评估为未定义。

另一个头文件在函数声明中使用宏P.

extern void long2str P((unsigned char *str,int pos,long clong));

然后在代码中的某些位置调用该函数,如

long2str(tmp_str, 0, seg_used(seg)); // <= error on this line

然而,VS2012在调用函数的行上标记错误

  

错误C2660:&#39; long2str&#39; :function不带3个参数

可能出现什么问题?

1 个答案:

答案 0 :(得分:4)

除非您使用的是20世纪80年代的C编译器,否则应确保采用#ifdef的第一个分支。

在这种情况下,找出未定义USE_ANSI_PROTOTYPES的原因。然后定义它或删除#ifdef部分并无条件地定义P宏。

Microsoft编译器没有定义__STDC__宏(无论出于何种原因),请参阅https://msdn.microsoft.com/en-us/library/b0084kay.aspx

说明:

早在1980年(在ANSI C89和ISO C90之前),函数就像这样声明:

extern void long2str ();

那就是它。没有参数名称,没有类型,只有函数名称(如果幸运的话,还有返回类型)。

ISO C90引入了函数原型,声明函数的首选方法是:

extern void long2str (unsigned char *str,int pos,long clong);

当您使用双括号中的参数调用时,您问题中的P宏可以生成两种变体。外括号形成一个单独的宏参数,内部括号仅在C90情况下需要。