9头文件与预处理
1、条件编译指令
#if // 如果,#if VER==1
#ifdef // 如果定义了...
#ifndef // 如果没有定义...
#elif // 否则如果...
#else // 否则
#endif // 和#if/#ifdef/#ifndef配对使用
#undef // 取消定义,和#define相反
满足条件(条件表达式的值非零)的代码参加编译,否则不参加编译。
2、头文件卫士
com.h
/ \
net.h des.h
/ \ / \
net.c main.c des.c
头文件卫士:在xxx.h中
#ifndef _XXX_H
#define _XXX_H
// 头文件代码...
#endif // _XXX_H
防止同一个.h文件被沿着不同路径包含到一个.c文件中产生重定义冲突。
一、头文件 第一个:com.h: #ifndef _COM_H //如果没有定义... #define _COM_H //就定义... #include <stdio.h> typedef struct tag_pack { char head[256]; char body[1024]; }pack; #endif //与上面#ifndef是成对 第二个:des.h: #include "com.h" void add2(pack *p); void sub2(pack *p); 第三个:net.h #include "com.h" void add(pack *p); void sub(pack *p); 二、源文件 第一个:des.c #include "des.h" void add2(pack *p) { printf("add2两数相加!\n"); } void sub2(pack *p) { pack t; add2(&t); printf("sub2两数相减!\n"); } 第二个:net.c #include "net.h" void add(pack *p) { printf("addg两数相加!\n"); } void sub(pack *p) { printf("sub两数相减!\n"); } 第三个:main.c #include "net.h" #include "des.h" int main() { pack p; add(&p); sub(&p); add2(&p); sub2(&p); return 0; }