C语言宏技巧

近日看到gtest的文章=》 http://www.cnblogs.com/coderzh/archive/2009/04/12/1434155.html 

对其宏使用的技巧感觉非常巧妙,使用宏充当了一个代码生成器的作用!!!用一句宏生成一个类(包括类的定义和实现)

参考: http://c.chinaitlab.com/basic/874223.html 对宏理解后,进行总结。



1, #在C语言的宏中的作用:字符串化

#define TESTCASE_NAME(testcase_name) testcase_name##_TEST

使用:TESTCASE_NAME(string_add)

gtest里的转化: class TESTCASE_NAME(testcase_name) : public TestCase  => class string_add_TEST : public TestCase


2, ##在C语言的宏中的作用: 连接符

gtest里的: new TESTCASE_NAME(testcase_name)(#testcase_name)); => new string_add_TEST("string_add") 



3,##在C语言的宏中的作用: 当__VAR_ARGS__为空的时候,消除前面的那个逗号。

#define myprintf(templt, …) fprintf(stderr,templt, ##__VAR_ARGS__)

当__VAR_ARGS__为空的时候,消除前面的那个逗号。 



4,宏里可以定义变量,C语言的宏中,在{}内部,可以用typeof来设定变量。

#define min(X,Y) ( { \

typeof(X) x_ = X; \
typeof(Y) y_ = Y; \

(x_ < y_) ? x_ : y_; } )


另外要注意的是,宏在操作符优先级可能会有问题,发生这种情况,可使用括号来设定优先级。

猜你喜欢

转载自blog.csdn.net/jfyy/article/details/7557885