<<1>>
定义一个头文件,test_var.h
#defineVAR(type, name) \ typename; VAR(int,i0) VAR(int,i1) VAR(char*,pstr) |
在源文件,test_var.cpp中定义
//code-1 structtest_stru{ #inlcude”test_var.h” } |
于是test_stru结构体中就有了inti0;int i1;char* pstr;三个成员变量。
<<2>>
若头文件中不使用
#ifndef… #define… #endif |
或#pragmaonec;来避免多次包含多次定义。那么头文件中的内容会在每次使用#include”...”时替换掉#include”...”,这个原则和宏定义很相似,甚至很可能根本就是一样的东西,只是宏是一小部分的替换,#include是整个文件的替换。比如code-1在预编译后,呈现在编译器面前会是如下:
structtest_stru{ #defineVAR(type, name) \ typename; inti0; // VAR(int ,i0) inti1; // VAR(int, i1) char*pstr; // VAR(char*, pstr) } |
正因为#include预编译指令的这种特性,使得头文件中如果不包含“编译一次”标志,编译器就会时不时提示我们某某对象多次定义错误。
<<3>>
另外,预编译指令#include还有一种用法:
{ #inlcude“test_var.h” i0=1; i1=3; pstr= “aaaa”; } { #inlcude“test_var.h” i0=2; i1=4; pstr= “bbbb”; } | #inlcude“test_var.h” i0=1; i1=3; pstr= “aaaa”; #inlcude“test_var.h” i0=2; i1=4; pstr= “bbbb”; |
//(正确用法)成功编译,{}限定了作用域,每一个{}中的i0,i1均为栈上对象,相互间不混淆。 | //(错误用法)编译失败,提示多重定义。 |
另外注意一点,当头文件中内容作最后一种用法时,禁止在头文件中定义函数,因为包含头文件后,会形成函数嵌套定义,为c/c++所不允许。声明函数原型可以。