最近在看一个开源项目的源代码,遇到这样的语法。
unsigned int md_opmask[OP_MAX] = { 0, #define DEFINST(OP,MSK,NAME,OPFORM,RES,FLAGS,O1,O2,O3,I1,I2,I3,I4) 0, #define DEFUOP(OP,NAME,OPFORM,RES,FLAGS,O1,O2,O3,I1,I2,I3,I4) 0, #define DEFlink(OP,MSK,NAME,SHIFT,MASK) MASK, #define CONNECT(OP) #include "machine.def" };
说实话刚开始看到这样的代码的时候确实让人感到非常的困惑,但是我们仔细剖析,发现也不过如此。其实上述代码中的宏定义和普通的宏定义区别不大,只是将他放到数组初始化中,这对数组的初始化并不会产生什么影响,而上述的包含头文件的意思就是将该头文件在此处直接展开,也就是利用头文件中的内容来初始化数组。
如下测试案例:
``cpp
unsigned int test[ 5 ]{
#include"arr.h"
};
其中 arr.h 中的内容为
1,2,3,6,5
上述的代码就相当于直接初始化数组: ```cpp unsigned int test[ 5 ] ={ 1,2,3,6,5 };
那么当我们在数组中定义宏的目的就是为了方便在我们所包含的头文件中宏展开, 如下代码:
#includeunsigned int test[5] = { 0 , #define MAX(a,b) (a) < (b) ? (b) : (a) , #define MIN(a,b) (a) < (b) ? (a) : (b) , #include "arr.h" }; int main() { int i = 0; for(i = 0; i < 5; ++i){ printf("%u n",test[i]); } return 0; }
如果头文件总有 MAX(a, b) 和 MIN(a,b), 那么就会被展开,比如
MAX(1 , 2); //将会被展开为 “ 2, ”
如果头文件 arr.h 中的内容如下的话。
MAX(1,3) MAX(3,6) MIN(7,2) MIN(7,9)
上述的程序的运行结果将会是这样的。
0 3 6 2 7
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)