我正在将一些遗留的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个参数
可能出现什么问题?
答案 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情况下需要。