本文简单来说明一下 #if
#define
#ifdef
#ifndef
的作用, 以及 #ifdef
和#ifndef
的区别.
#define
#define
用来进行定义
#define kTabBar_Height 49.0f
#define kString @"哈哈哈"
#if
#if 常量表达式
//程序段1
#else
// 程序段2
#endif
它的作用是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能。
#ifdef
#ifdef <标识符>
//程序段1
#else
//程序段2
#endif
它的作用是:当标识符已经被定义过,则对程序段1进行编译,否则编译程序段2。
#ifndef
#ifndef <标识符>
//程序段1
#else
//程序段2
#endif
只是第一行与前一种形式不同:将#ifdef
改为#ifndef
。它的作用是:若标识符未被定义则编译程序段1,否则编译程序段2。这种形式与第一种形式的作用相反。
但是也是有区别的一般的, 条件指示符#ifndef
检查预编译常量在前面是否已经被定义。#ifndef 的最主要目的是防止头文件的重复包含和编译。
如果#ifndef…#endif在头文件中,千万不要忽略了头件的中的#ifndef
,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。
所以, 还是把头文件的内容都放在#ifndef
和#endif
中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:
#ifndef <标识>
#define <标识>
......
......
#endif
#endif
<标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h
#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif
#endif