条件编译使用举例
例1 编写可移植到不同机器或者操作系统上的程序
#if defined(WIN32)
...
#elif defined(MAC_OS)
...
#elif defined(LINUX)
...
#endif
例2 编写支持不同编译器的程序
#if __STDC__
Function prototypes
#else
old-style function declarations
#endif
例3 提供一个默认的宏定义
#ifndef BUFFER_SIZE
#define BUFFER_SIZE 256
#endif
例4 暂时屏蔽注释的代码
#if 0
包含注释的行
#endif
例5 防止同一个头文件被多次包含
假设file1.h
包含file3.h
,file2.h
包含file3.h
,prog.c
同时包含file1.h
和file2.h
,如果不进行处理,则编译prog.c
时,file3.h
就会被编译两次,并会报错。
源文件prog.c
#include <stdio.h>
#include "file1.h"
#include "file2.h"
int main(void)
{
printf("test in prog.c\n");
return 0;
}
源文件file1.h
#include "file3.h"
void h(void)
{
g();
}
源文件file2.h
#include "file3.h"
void test2(void)
{
g();
}
源文件file3.h
#include <stdio.h>
#define TEST 0
void f(void);
int test = 0;
void g(void)
{
printf("test in file3.c\n");
}
此时,执行如下指令,有报错输出:
$ gcc -c prog.c file1.h file2.h file3.h
In file included from prog.c:3:
In file included from ./file2.h:2:
./file3.h:7:5: error: redefinition of 'test'
int test = 0;
^
./file1.h:2:10: note: './file3.h' included multiple times, additional include
site here
#include "file3.h"
^
./file2.h:2:10: note: './file3.h' included multiple times, additional include
site here
#include "file3.h"
^
./file3.h:7:5: note: unguarded header; consider using #ifdef guards or #pragma
once
int test = 0;
^
In file included from prog.c:3:
In file included from ./file2.h:2:
./file3.h:9:6: error: redefinition of 'g'
void g(void)
^
./file3.h:9:6: note: previous definition is here
void g(void)
^
2 errors generated.
解决方法:
在file3.h
中添加如下的预处理指令
#ifndef FILE3_H
#define FILE3_H
... //这里是原file3.h的内容
#endif
修改后的file3.h
文件,然后编译通过:
#ifndef FILE3_H
#define FILE3_H
#include <stdio.h>
#define TEST 0
void f(void);
int test = 0;
void g(void)
{
printf("test in file3.c\n");
}
#endif
网友评论