两个功能
1.不同点.c文件包含同一个.h文件,想用这个.h文件的头文件可以用#ifdef
例如
globe.h
#ifdef EXTERN
extern char globle_str[];
#else
int i=11;
#endif
main.c
#define EXTERN //定义宏EXTERN后
#include "globe.h"
#include <stdio.h>
void output()
{
puts(globe_str);//上边定义了宏EXTERN,所以这里可以用globe.h中的char globle_str[]变量
}
main_1.c
#include "globe.h"
void output();
int main()
{
printf("%d",i);//上边没有定义宏EXTERN,所以这里用globe.h中的char globle_str[]变量
output();
return 0;
}
2.条件编译时用,例如想在debug下编译输出,在release
********************************************
#ifdef 标识符
程序段1
#else
程序段2
#endif
它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。
其中#else部分也可以没有,即:
#ifdef
程序段1
#denif
#include <stdio.h>
#include <unistd.h>
int main()
{
while(1)
{
#ifdef debug
printf("hello\n");
#endif
sleep(1);
}
return 0;
}
写的makefile:
#! /bin/sh
ver = debug
ifeq ($(ver),debug)
ALL:DebugPrint
endif
ifeq ($(ver),release)
ALL:ReleasePrint
endif
DebugPrint:welcome.do
gcc welcome.do -o debug
rm -f welcome.do
ReleasePrint:welcome.ro
gcc welcome.ro -o release
rm -f welcome.ro
welcome.do:welcome.c
gcc -c -g -Ddebug welcome.c -o welcome.do
welcome.ro:welcome.c
gcc -c -O3 welcome.c -o welcome.ro
这样就会在debug时编译输出hello,release时不编译printf那行。