C语言中##表示什么意思?

shellfish567 2010-01-13 11:56:17
例如:
#define con_lo(x,y) x##yy




#if defined(ARRAYS)
#define locals(x,y) x[8],y[8]
#else
#define locals(x,y) x##0,x##1,x##2,x##3,x##4,x##5,x##6,x##7,\
y##0,y##1,y##2,y##3,y##4,y##5,y##6,y##7
#end if




#可以用来连接字符串,##就不知道了……望指点下哈,立即给分
...全文
7607 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shanleichicheng 2010-12-08
  • 打赏
  • 举报
回复
Thanks!!!
shellfish567 2010-01-13
  • 打赏
  • 举报
回复
谢谢哈~。~版主你分多就不给了哈,给一楼了~。~
swl82560397pq 2010-01-13
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复 3
http://blog.csdn.net/hairetz/archive/2009/11/08/4785047.aspx

以前转过一篇,好好看下,蛮有用的。

1. 宏可以像函数一样被定义,例如:
#define min(x,y) (x 但是在实际使用时,只有当写上min(),必须加括号,min才会被作为宏展开,否则不做任何处理。

2. 如果宏需要参数,你可以不传,编译器会给你警告(宏参数不够),但是这会导致错误。如C++书籍中所描
述的,编译器(预处理器)对宏的语法检查不够,所以更多的检查性工作得你自己来做。

3. 很多程序员不知道的#和##
#符号把一个符号直接转换为字符串,例如:
#define STRING(x) #x
const char *str = STRING( test_string ); str的内容就是"test_string",也就是说#会把其后的符号
直接加上双引号。
##符号会连接两个符号,从而产生新的符号(词法层次),例如:
#define SIGN( x ) INT_##x
int SIGN( 1 ); 宏被展开后将成为:int INT_1;

4. 变参宏,这个比较酷,它使得你可以定义类似的宏:
#define LOG( format, ... ) printf( format, __VA_ARGS__ )
LOG( "%s %d", str, count );
__VA_ARGS__是系统预定义宏,被自动替换为参数列表。

5. 当一个宏自己调用自己时,会发生什么?例如:
#define TEST( x ) ( x + TEST( x ) )
TEST( 1 ); 会发生什么?为了防止无限制递归展开,语法规定,当一个宏遇到自己时,就停止展开,也就是
说,当对TEST( 1 )进行展开时,展开过程中又发现了一个TEST,那么就将这个TEST当作一般的符号。TEST(1)
最终被展开为:1 + TEST( 1) 。


liao05050075 2010-01-13
  • 打赏
  • 举报
回复 1
#define中的 #与##
  #define GPEBLT_FUNCNAME(basename) (SCODE (GPE::*)(struct GPEBltParms *))&GPE::##basename
  在#define中,标准只定义了#和##两种操作。#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串。
  #include <stdio.h>
  #define paster( n ) printf( "token " #n" = %d\n ", token##n )
  int main()
  {
  int token9=10;
  paster(9);
  return 0;
  }
  输出为
  [leshy@leshy src]$ ./a.out
  token 9 = 10

http://baike.baidu.com/view/1611565.htm

69,370

社区成员

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

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