- 12.2 #import语句
- define INCHES_PER_CENTIMETER 0.394
- define CENTIMETERS_PER_INCH(1/INCHES_PER_CENTIMETER)
- define QUARTS_PER_LITER 1.057
- define LITERS_PER_QUART(1/QUARTS_PER_LITER)
- define OUNCES_PER_GRAM 0.035
- define GRAMS_PER_OUNCE(1/OUNCES_PER_GRAM)
- import“metric.h”
- import<Foundation/Foundation.h>
- import<Foundation/Foundation.h>
- import“metric.h”
12.2 #import语句
经过一段时间的Objective-C编程后,你将发现自己开发了一组宏,你想在每一个程序中使用它们。但是不必在编写的每个新程序中键入这些宏,相反,预处理程序允许你将所有定义收集到一个单独文件中,然后使用#import语句把它们包含在程序中。这些文件类似于前面遇到的、但是不必是你自己编写的程序,它们通常以.h结尾,人们将其称为头文件(header file)或包含文件(include file)。
假设你正在编写一系列程序,用于执行各种量度转换。你可能想为执行转换所需要的各种常量设置一些#define语句:
define INCHES_PER_CENTIMETER 0.394
define CENTIMETERS_PER_INCH(1/INCHES_PER_CENTIMETER)
define QUARTS_PER_LITER 1.057
define LITERS_PER_QUART(1/QUARTS_PER_LITER)
define OUNCES_PER_GRAM 0.035
define GRAMS_PER_OUNCE(1/OUNCES_PER_GRAM)
……
假设将前面的定义输入到系统中一个名为metric.h的独立文件中。随后任何需要使用包含在metric.h中定义的程序都只需简单地使用以下预处理程序指令:
import“metric.h”
在引用metric.h中的定义之前,必须出现这条语句,并且通常放在源文件的开始处。预处理程序在系统中寻找指定的文件,并且有效地把该文件的内容拷贝到程序中出现#import语句的确切位置。这样,该文件中的所有语句似乎都是直接在程序中该位置键入的。
头文件名两侧的双引号指示预处理程序在一个或者多个文件目录(通常首先在包含源文件的目录中查找,但是通过修改适当的“项目设置”,可以用Xcode指定预处理程序搜索的确切位置)中寻找指定的文件。
把文件名放在<和>字符之间,例如
import<Foundation/Foundation.h>
将导致预处理程序只在特殊的“system”头文件目录中寻找包含文件,当前目录不会被搜索。同样,使用Xcode可以通过从菜单中选择“项目”、“编辑项目设置”来更改这些目录。
注意编译本部分的程序时,我会从系统目录/Developers/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers中导入Foundation.h文件。
要查看实际程序例子中如何使用包含文件,将前面给出的6条#define语句键入名为metric.h的文件中,然后以常规方式键入并运行代码清单12-1。
代码清单12-1
/*Illustrate the use of the#import statement
Note:This program assumes that definitions are
set up in a file called metric.h*/
import<Foundation/Foundation.h>
import“metric.h”
int main(int argc, char*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];
float liters, gallons;
NSLog(@“Liters to Gallons*”);
NSLog(@“Enter the number of liters:);
scanf(“f”,&liters);
gallons=liters*QUARTS_PER_LITER/4.0;
NSLog(@“g liters=%g gallons”,liters, gallons);
[pool drain];
return 0;
}
代码清单12-1输出
Liters to Gallons
Enter the number of liters:
55.75
55.75 liters=14.7319 gallons.
代码清单12-1相当简单,因为它只显示一个预定义值(QUARTS_PER_LITER),该值引自包含文件metric.h。不管怎么样,可以得出这样一点:将定义输入metric.h文件之后,就能够在任何使用合适的#import语句的程序中使用它们。
导入文件最出色的能力之一是它使你能够把定义集中起来,从而确保所有程序引用相同的值。此外,包含文件中发现的任何值错误只需在该位置修改,从而不必更正每个使用该值的程序。任何引用这个错误值的程序只需简单地重新编译一下,而不必重新编辑。
其他系统包含文件包含存储在底层C系统库中的各种函数的声明。例如,limits.h包含一些系统相关值,它们指定各种字符和整型数据类型的大小。例如,在这个文件中,名称INT_MAX定义了int型的最大大小,ULONG_MAX定义了unsigned long int型的最大大小,等等。
头文件float.h给出关于浮点数据类型的信息。例如,FLT_MAX指定了最大的浮点数,FLT_DIG指定了float类型小数的十进制位的精度数。
文件string.h包含执行字符串操作(如复制、比较和连接)的库例程的声明。如果专门使用Foundation字符串类(将在第15章“数字、字符串和集合”中讨论),那么程序中可能不需要使用这些例程。