define定义的宏中,可否带有预编译指令,能否带有#号
define定义的宏中,可否带有预编译指令,能否带有#号
我们项目每个TUXEDO服务前都要有个
[code]#if defined(__STDC__) || defined(__cplusplus)
SVCBILLCYCLE(TPSVCINFO *rqst)
#else
SVCBILLCYCLE(rqst)
TPSVCINFO *rqst;
#endif[/code]
想用个宏来替换
[code]#define FUNCTION_D(x) void \
#if defined(__STDC__) || defined(__cplusplus)\
SVCBILLCYCLE(TPSVCINFO *rqst) \
#else \
SVCBILLCYCLE(rqst) \
TPSVCINFO *rqst; \
#endif\[/code]
编译时出错
-->
因为C语言中"#"和"##"都已经有意义,所以会出错。
那在#define中,怎么才能带有"#"字符?
define定义的宏中,可否带有预编译指令,能否带有#号
还有怎样才能显示双引号?
例如
#define foo(bar) "bar"
我想得到变量名所表示的字符串常量
foo(hi) -->; "hi"
foo(i) -->; "i"
define定义的宏中,可否带有预编译指令,能否带有#号
"\"bar\""
这样应该可以.
define定义的宏中,可否带有预编译指令,能否带有#号
SVCBILLCYCLE(TPSVCINFO *rqst)后面加个;试试
define定义的宏中,可否带有预编译指令,能否带有#号
2楼的:
#define foo(bar) "\"bar\""
define定义的宏中,可否带有预编译指令,能否带有#号
楼上说的不行
我的意思是由变量的名字产生一个字符串
例如
int hi;
char *hello;
foo(hi) 输出是 "hi"
foo(hello) 输出是 "hello"
define定义的宏中,可否带有预编译指令,能否带有#号
那你只能在编译的时候 -D 实现了.
知道什么叫宏定义吗? 编译的时候就替换了..你想动态的替换那就用函数.别用宏
define定义的宏中,可否带有预编译指令,能否带有#号
-->
你楼上说的很对,除非你自己表达得不对。
难道是这个?#define foo(x) ##x
foo(woodhead)输出woodhead
define定义的宏中,可否带有预编译指令,能否带有#号
-->
gcc编译错误
'##' cannot appear at either end of a macro expansion
gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-81)
我的意思就是foo(x)被替换成"x"
:em06: :em06: :em06: :em06: :em06:
define定义的宏中,可否带有预编译指令,能否带有#号
#define fo(x) \
"\""##x##"\""
define定义的宏中,可否带有预编译指令,能否带有#号
楼上的
warning: pasting ""\""" and "x" does not give a valid preprocessing token
试了一下,应该是
#define foo(x) #x
谢谢各位的解答!
define定义的宏中,可否带有预编译指令,能否带有#号
我们项目每个TUXEDO服务前都要有个
[code]#if defined(__STDC__) || defined(__cplusplus)
SVCBILLCYCLE(TPSVCINFO *rqst)
#else
SVCBILLCYCLE(rqst)
TPSVCINFO *rqst;
#endif[/code]
想用个宏来替换
[code]#define FUNCTION_D(x) void \
#if defined(__STDC__) || defined(__cplusplus)\
SVCBILLCYCLE(TPSVCINFO *rqst) \
#else \
SVCBILLCYCLE(rqst) \
TPSVCINFO *rqst; \
#endif\[/code]
编译时出错
-->
因为C语言中"#"和"##"都已经有意义,所以会出错。
那在#define中,怎么才能带有"#"字符?
![icon_new.gif](http://www.lslnet.com/images/icon_new.gif)
还有怎样才能显示双引号?
例如
#define foo(bar) "bar"
我想得到变量名所表示的字符串常量
foo(hi) -->; "hi"
foo(i) -->; "i"
![icon_new.gif](http://www.lslnet.com/images/icon_new.gif)
"\"bar\""
这样应该可以.
![icon_new.gif](http://www.lslnet.com/images/icon_new.gif)
SVCBILLCYCLE(TPSVCINFO *rqst)后面加个;试试
![icon_new.gif](http://www.lslnet.com/images/icon_new.gif)
2楼的:
#define foo(bar) "\"bar\""
![icon_new.gif](http://www.lslnet.com/images/icon_new.gif)
楼上说的不行
我的意思是由变量的名字产生一个字符串
例如
int hi;
char *hello;
foo(hi) 输出是 "hi"
foo(hello) 输出是 "hello"
![icon_new.gif](http://www.lslnet.com/images/icon_new.gif)
那你只能在编译的时候 -D 实现了.
知道什么叫宏定义吗? 编译的时候就替换了..你想动态的替换那就用函数.别用宏
![icon_new.gif](http://www.lslnet.com/images/icon_new.gif)
-->
你楼上说的很对,除非你自己表达得不对。
难道是这个?#define foo(x) ##x
foo(woodhead)输出woodhead
![icon_new.gif](http://www.lslnet.com/images/icon_new.gif)
-->
gcc编译错误
'##' cannot appear at either end of a macro expansion
gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-81)
我的意思就是foo(x)被替换成"x"
:em06: :em06: :em06: :em06: :em06:
![icon_new.gif](http://www.lslnet.com/images/icon_new.gif)
#define fo(x) \
"\""##x##"\""
![icon_new.gif](http://www.lslnet.com/images/icon_new.gif)
楼上的
warning: pasting ""\""" and "x" does not give a valid preprocessing token
试了一下,应该是
#define foo(x) #x
谢谢各位的解答!
转载于:https://blog.51cto.com/axlrose/1294419