C语言模板理解以后,对学习C++中的模板,ATL, WTL, 在理解上很有好处.
/// @file exam_1_1.c
/// @brief C语言模板例子
/// C++的模板操作由编译器提供支持, 编译器底层也是用C语言模板的方法实现.
#include <stdlib.h>
#include <stdio.h>
/// C语言模板是由宏实现的
/// 使用带参数宏时, # 和 ## 符号的含义
/// #define STR(x) #x ///< #代表字符串
/// #define STR(x, y) x##y 表示x和y进行拼接
/// C语言模板的使用时分3步
/// 模板定义 => 模板实例化 => 模板实例调用
/// 模板定义
/// 模板定义时,并没有产生任何代码
#define DEFINE_MAX_EX(type) type maxEx##type(type x, type y) \
{ \
return (((x) > (y)) ? (x) : (y)); \
}
/// 模板实例化
/// 模板实例化时, 由编译器产生了代码
DEFINE_MAX_EX(int);
DEFINE_MAX_EX(float);
DEFINE_MAX_EX(double);
/// 模板实例调用, 最终使用者调用这个宏
/// 当调用模板实例化产生的代码实例时, 完成了实际的调用
/// CALL_MAX_EX 是又写了一个宏, 简化了对模板实例化后的代码进行调用
#define CALL_MAX_EX(type, x, y) maxEx##type((x), (y))
int main(int argc, char** argv)
{
int iTmp = 0;
float fTmp = .0f;
double dblTmp = 0;
printf("hello, C template\n");
iTmp = CALL_MAX_EX(int, 3, 6);
fTmp = CALL_MAX_EX(float, 3.0f, 6.0f);
dblTmp = CALL_MAX_EX(double, 3.0, 6.0);
printf("iTmp = %d\n", iTmp);
printf("fTmp = %f\n", fTmp);
printf("dblTmp = %f\n", dblTmp);
printf("END, press any key to quit\n");
/** run result
hello, C template
iTmp = 6
fTmp = 6.000000
dblTmp = 6.000000
END, press any key to quit
*/
getchar();
return 0;
}
手工加入/P选项, 产生.i文件.
.i文件是预处理之后的源码文件, 可以看到宏转换后的实际代码. 只选择文件进行编译(只是编译, 仅仅为了看.i文件).
int maxExint(int x, int y) { return (((x) > (y)) ? (x) : (y)); };
float maxExfloat(float x, float y) { return (((x) > (y)) ? (x) : (y)); };
double maxExdouble(double x, double y) { return (((x) > (y)) ? (x) : (y)); };
int main(int argc, char** argv)
{
int iTmp = 0;
float fTmp = .0f;
double dblTmp = 0;
printf("hello, C template\n");
iTmp = maxExint((3), (6));
fTmp = maxExfloat((3.0f), (6.0f));
dblTmp = maxExdouble((3.0), (6.0));