C语言如何定义一个宏,可以有参数或无参数的调用?

rickys2080 2014-12-10 05:42:52
C语言如何定义一个宏,可以有参数或无参数的调用?
比如定义宏:

#define WORK(x) if(rand()>100) return x;

当我在一个void fun();函数里调用WORK()的时候,希望没有返回值,就写无参数的work(),
如果在一个int fun2()函数里调用WORK()的时候,希望返回值为整形,就写有参数的work(1)。

宏WORK()该怎么定义呢?
...全文
592 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZG 2014-12-11
  • 打赏
  • 举报
回复
宏就是简单的替换,它不管什么有参还是无参,如果替换过后的语法没问题就行
「已注销」 2014-12-11
  • 打赏
  • 举报
回复
引用 3 楼 sinservice 的回复:

#define NOTHING
#define WORK(x) if(rand()>100) return x;
当没有返回值时,就使用: WORK(NOTHING)
这个如果不行,可能需要加一层壳。

#define _NOTHING
#define NOTHING _NOTHING
#define WORK(x) if(rand()>100) return x;
FancyMouse 2014-12-11
  • 打赏
  • 举报
回复
用variadic macro(需要c99/c++11)

#define WORK(...) if(rand()>100) return __VA_ARGS__;
rickys2080 2014-12-11
  • 打赏
  • 举报
回复
引用 5 楼 sholber 的回复:
你不都定义好了吗,就像你已经定义的那样:
#define WORK(x) if(rand()>100) return x;
这是绝对可以工作的。 WORK(); WORK(1);
GCC的确可以工作,VC会报个warning:warning C4003: not enough actual parameters for macro 'WORK' C++Builder6直接error不能编译成功:E2219 Wrong number of arguments in call of macro 'WORK'
赵4老师 2014-12-11
  • 打赏
  • 举报
回复
VC编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。gcc加-E
aa5566f4 2014-12-10
  • 打赏
  • 举报
回复
學道真多阿謝謝各為
均陵鼠侠 2014-12-10
  • 打赏
  • 举报
回复
你不都定义好了吗,就像你已经定义的那样:
#define WORK(x) if(rand()>100) return x;
这是绝对可以工作的。 WORK(); WORK(1);
「已注销」 2014-12-10
  • 打赏
  • 举报
回复

#define NOTHING
#define WORK(x) if(rand()>100) return x;
当没有返回值时,就使用: WORK(NOTHING)
「已注销」 2014-12-10
  • 打赏
  • 举报
回复

#define NOTHING
#define WORK(x) if(rand()>100) return x;
当没有返回值时,就使用: WORK(NOTHING)
starytx 2014-12-10
  • 打赏
  • 举报
回复
函数可以给形参设默认值,不传就用默认值,返回值没见过可以时有时无的
  • 打赏
  • 举报
回复
分两个宏不就行了吗 为什么非要弄一个或者
#define    RETURN
#ifdef   RETURN
       #define WORK(x) if(rand()>100) return x
#else
       #define   WORK(x)  if(rand()>100)  //do other thing
#endif

70,026

社区成员

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

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