error C2010: “.”: 宏形参表中的意外

梦林menglin 2016-03-23 08:33:10
下面三个语句都出现了: error C2010: “.”: 宏形参表中的意外

#define errprintf(fmt, args...){fprintf(stderr, __FUNCTION__ fmt, ## args); }

#define eprintf(fmt, args...) fprintf(stderr, fmt, ## args);

#define dprintf(fmt,args...)

我猜可能是gcc和VS里面的宏不兼容造成的,请问大神们如何改呢

谢谢
...全文
2184 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
dlvector 2021-07-17
  • 打赏
  • 举报
回复

修改成VS可以输出的格式就可以了。这种arg...应该是DSP可编译的格式。

赵4老师 2016-03-24
  • 打赏
  • 举报
回复
学习代码生成技术。
fefe82 2016-03-24
  • 打赏
  • 举报
回复
引用 楼主 sinat_22168483 的回复:
下面三个语句都出现了: error C2010: “.”: 宏形参表中的意外 #define errprintf(fmt, args...){fprintf(stderr, __FUNCTION__ fmt, ## args); } #define eprintf(fmt, args...) fprintf(stderr, fmt, ## args); #define dprintf(fmt,args...) 我猜可能是gcc和VS里面的宏不兼容造成的,请问大神们如何改呢 谢谢
gcc 的扩展。在不支持这一扩展的编译器上实现相同的功能几乎不可能。见到过有人写出过方案支持 N 个以内的参数(这也挺复杂的),但是没有见过支持任意多参数的方案。 =========== 写成 #define errprintf(fmt, ...){fprintf(stderr, __FUNCTION__ fmt, __VAR_ARGS__); } 是可以的,但是 .... 的位置必须至少提供一个参数。 就是,以前写成 errprintf("this is an error") 的地方,现在要改成 errprintf("%s", "this is an error") 。
梦林menglin 2016-03-24
  • 打赏
  • 举报
回复
请使用VS2013或2015版本~2013开始才能支持部分C99标准。[/quote] 关于Visual C 2013对C99标准的支持也可参考这篇博文——http://www.cnblogs.com/zenny-chen/p/3632071.html [/quote]非常感谢,我去试试
zenny_chen 2016-03-24
  • 打赏
  • 举报
回复
引用 12 楼 zenny_chen 的回复:
[quote=引用 11 楼 sinat_22168483 的回复:]
请使用VS2013或2015版本~2013开始才能支持部分C99标准。[/quote] 关于Visual C 2013对C99标准的支持也可参考这篇博文——http://www.cnblogs.com/zenny-chen/p/3632071.html
zenny_chen 2016-03-24
  • 打赏
  • 举报
回复
引用 11 楼 sinat_22168483 的回复:
请使用VS2013或2015版本~2013开始才能支持部分C99标准。
梦林menglin 2016-03-24
  • 打赏
  • 举报
回复
引用 9 楼 chehw_1 的回复:
[quote=引用 8 楼 sinat_22168483 的回复:] 用这个语句替换前面一个语句后出现了; error C2065: “__VAR_ARGS__”: 未声明的标识符
VC6 应该是不支持(可以考虑用codeblocks),. 查了一下MSDN,似乎VS2005以上应该都可以(我没有实际环境,测试不了)。 https://msdn.microsoft.com/en-us/library/ms177415(v=vs.80).aspx[/quote]我用的是VS2012。谢谢你的回答,我再试试
梦林menglin 2016-03-24
  • 打赏
  • 举报
回复
引用 4 楼 fefe82 的回复:
[quote=引用 楼主 sinat_22168483 的回复:] 下面三个语句都出现了: error C2010: “.”: 宏形参表中的意外 #define errprintf(fmt, args...){fprintf(stderr, __FUNCTION__ fmt, ## args); } #define eprintf(fmt, args...) fprintf(stderr, fmt, ## args); #define dprintf(fmt,args...) 我猜可能是gcc和VS里面的宏不兼容造成的,请问大神们如何改呢 谢谢
gcc 的扩展。在不支持这一扩展的编译器上实现相同的功能几乎不可能。见到过有人写出过方案支持 N 个以内的参数(这也挺复杂的),但是没有见过支持任意多参数的方案。 =========== 写成 #define errprintf(fmt, ...){fprintf(stderr, __FUNCTION__ fmt, __VAR_ARGS__); } 是可以的,但是 .... 的位置必须至少提供一个参数。 就是,以前写成 errprintf("this is an error") 的地方,现在要改成 errprintf("%s", "this is an error") 。[/quote]用你的语句替换后并把改成 errprintf("%s", "this is an error")出现了: error C2065: “__VAR_ARGS__”: 未声明的标识符 。请问这要如何改。 出错语句如下: eprintf("The size of 'h' is [%d x %d]\n", m, n); eprintf("Ntaps = %d\n Nf = %d \n", Ntaps, Nf);
chehw_1 2016-03-24
  • 打赏
  • 举报
回复
引用 8 楼 sinat_22168483 的回复:
用这个语句替换前面一个语句后出现了; error C2065: “__VAR_ARGS__”: 未声明的标识符
VC6 应该是不支持(可以考虑用codeblocks),. 查了一下MSDN,似乎VS2005以上应该都可以(我没有实际环境,测试不了)。 https://msdn.microsoft.com/en-us/library/ms177415(v=vs.80).aspx
zenny_chen 2016-03-24
  • 打赏
  • 举报
回复
引用 2 楼 chehw_1 的回复:
#define errprintf(fmt, ...) do { fprintf(stderr, fmt, __VA_ARGS__); } while(0) 如果调用时的可变的参数可能是0个,上面的宏会出问题,在Linux下可以改写为下面的形式(加上两个“#”号) #define errprintf(fmt, ...) do { fprintf(stderr, fmt, ##__VA_ARGS__); } while(0)
呼呼,索性简单粗暴一些——

#define errprintf(...)   do  { fprintf(stderr,  __VA_ARGS__); } while(0)
这样就OK了~
梦林menglin 2016-03-24
  • 打赏
  • 举报
回复
引用 3 楼 zenny_chen 的回复:
[quote=引用 2 楼 chehw_1 的回复:] #define errprintf(fmt, ...) do { fprintf(stderr, fmt, __VA_ARGS__); } while(0) 如果调用时的可变的参数可能是0个,上面的宏会出问题,在Linux下可以改写为下面的形式(加上两个“#”号) #define errprintf(fmt, ...) do { fprintf(stderr, fmt, ##__VA_ARGS__); } while(0)
呼呼,索性简单粗暴一些——

#define errprintf(...)   do  { fprintf(stderr,  __VA_ARGS__); } while(0)
这样就OK了~[/quote]用这个语句替换前面两个语句后出现了: fatal error LNK1181: 无法打开输入文件“kernel32.lib” 用这个语句替换前面一个语句后出现了; error C2065: “__VAR_ARGS__”: 未声明的标识符
梦林menglin 2016-03-24
  • 打赏
  • 举报
回复
引用 1 楼 wang0635 的回复:
三个小数(省略号?)点是意外的吧
不是意外
梦林menglin 2016-03-24
  • 打赏
  • 举报
回复
引用 2 楼 chehw_1 的回复:
#define errprintf(fmt, ...) do { fprintf(stderr, fmt, __VA_ARGS__); } while(0) 如果调用时的可变的参数可能是0个,上面的宏会出问题,在Linux下可以改写为下面的形式(加上两个“#”号) #define errprintf(fmt, ...) do { fprintf(stderr, fmt, ##__VA_ARGS__); } while(0)
用这个语句替换后,运行程序出现: fatal error LNK1181: 无法打开输入文件“kernel32.lib”
chehw_1 2016-03-23
  • 打赏
  • 举报
回复
#define errprintf(fmt, ...) do { fprintf(stderr, fmt, __VA_ARGS__); } while(0) 如果调用时的可变的参数可能是0个,上面的宏会出问题,在Linux下可以改写为下面的形式(加上两个“#”号) #define errprintf(fmt, ...) do { fprintf(stderr, fmt, ##__VA_ARGS__); } while(0)
wang0635 2016-03-23
  • 打赏
  • 举报
回复
三个小数(省略号?)点是意外的吧

70,027

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧