易截截图软件、单文件、免安装、纯绿色、仅160KB

C/C++ 宏带来的奇技淫巧

作者:Kevin Lynx 来源:C++博客
转自:http://www.kuqin.com/language/20080319/4797.html
众多C++书籍都忠告我们C语言宏是万恶之首,但事情总不如我们想象的那么坏,就如同goto一样。宏有
一个很大的作用,就是自动为我们产生代码。如果说模板可以为我们产生各种型别的代码(型别替换),
那么宏其实可以为我们在符号上产生新的代码(即符号替换、增加)。
关于宏的一些语法问题,可以在google上找到。相信我,你对于宏的了解绝对没你想象的那么多。如果你
还不知道#和##,也不知道prescan,那么你肯定对宏的了解不够。
我稍微讲解下宏的一些语法问题(说语法问题似乎不妥,macro只与preprocessor有关,跟语义分析又无关):
1. 宏可以像函数一样被定义,例如:
   #define min(x,y) (x<y?x:y) //事实上这个宏存在BUG
   但是在实际使用时,只有当写上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)


相关文档:

一道c面试题

int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
printf("%d,%d",*ptr,*(++ptr));
此题最后的结果是8,8.
乍看结果应该是7和8。
原理:
因为它们作为printf的参数,函数printf从左往右读取,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所有我们看见的结果是,从右边开始处理的。 ......

C++中extern “C”含义深层探索

1.引言
  C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕� ......

C与C++文件互相调用

时常在cpp的代码之中看到这样的代码:
#ifdef __cplusplus 
extern "C" { 
#endif
//一段代码
#ifdef __cplusplus 

#endif 
    这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的� ......

高质量C++/C编程指南

http://man.lupaworld.com/content/develop/c&c++/c/c.htm
1. 如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改
2. 在函数体的“入口处”,对参数的有效性进行检查
    在函数体的“出口处”,对return语句的正确性和效率进行检 ......

在Eclipse中开发C/C++项目 转帖


C/C++ development with the Eclipse Platform
Pawel Leszek
 
摘要:通过本文你将获得如何在Eclipse平台上开发C/C++项目的总体认识。虽然Eclipse主要被用来开发Java项目,但它的框架使得它很容易实现对其他开发语言的支持。在这篇文章里,你将学会如何使用CDT(C/C++ Development Toolkit),一个在Eclipse平台上最 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号