1.1 简介
1.1.2 预处理指令
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_COLS 20 /*所能处理的最大列号*/
#define MAX_INPUT 1000 /*每个输入行的最大长度*/
这5行称为预处理指令(preprocessor directive)。因为它们是由预处理器(preprocessor)解释的。预处理器读入源代码,根据预处理指令对其进行修改,然后把修改过的源代码递交给编译器。
预处理器用名叫stdio.h的库函数头文件的内容替换第1条#include指令语句,其结果仿佛是stdio.h的内容被逐字节写到源文件的那个位置。
stdio.h头文件使我们可以访问标准I/O库(Standard I/O Library)中的函数,这组函数用于执行
输入和输出。stdlib.h定义了EXIT_SUCCESS和EXIT_FAILURE符号。我们需要string.h头文件提供的函数来操纵字符串。
提示:
如果你有一些声明需要用于几个不同的源文件,这个技巧也非常方便---在一个单独的文件中编写这些声明,然后用#include指令把这个文件包含到需要使用这些声明的源文件中。这样,只需要这些声明的一份副本,无须在许多不同的地方进行复制,这就避免了维护这些代码时出现错误的可能性。
提示:
另一种预处理指令是#define。当这个名字出现在源文件的任何地方时,它就会被替换成定义的值。字符串常量不能出现在有些普通变量可以出现的场合(比如赋值符的右边)。这些名字一般都大写,用于提醒它们并非普通的变量。#define指令和其他语言中的符号常量的作用类似,出发点也相同。
int read_column_numbers( int columns[], int max );
void rearrange( char *output, char const *input, int n_columns, int const columns[] );
这些声明被称为函数原型(function prototype)。它们告诉编译器这些以后将在源文件中定义的
函数的特征。这样,当这些函数被调用时,编译器就能对它们进行正确性检查。每个原型以一个类型名开头,表示函数返回值的类型。跟在返回类型名后面的是函数的名字,再后面是函数中的数组和整型标量的参数。函数原型中参数的名字并非必需的,这里给出参数名的目的是提示它们的作用。因此也可以写成:
int read_column_numbers( int [], int );
void rearrange( char *, char const *, int, int const );
不过提供参数名可以给读者提供更详细的信息,因此最好不要省略。
指针指定一个存储于计算机内存中的值的地址,类似于门牌号码指定某个特定的家庭位于街道的何处。const表示函数将不会修改函数调用者所传递的这两个参数。关键字void表示函数并不返回任何值,在其他语言里,这种无返回值的函数被称为过程(precedure)。
提示:
假如这个程序的源代码由几个源文件所组成,那么使用该函数的源文件都必须写明该函数的原型。把原型放在头文件中并使用#include指令包含它们,可以避免由于同一个声明的多份副本而导致的维护问题。
C和指针 第1章 快速上手 1.1.2 预处理指令
于 2022-06-07 23:12:44 首次发布