近日看到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
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_; } )
另外要注意的是,宏在操作符优先级可能会有问题,发生这种情况,可使用括号来设定优先级。