下面的 C 源程序包括两个源文件。 它尽可能在 C 程序中提供一些各种声明和定义的概述。 本书后面的各部分将介绍如何编写这些声明、定义和初始化,以及如何使用 C 关键字(如 static 和 extern)。 在 C 标头文件 STDIO.H. 中声明 printf 函数。
假定 main 和 max 函数在单独的文件中,且程序的执行开始于 main 函数。 未在 main 之前执行任何显式用户函数。
/*****************************************************************
FILE1.C - main function
*****************************************************************/
#define ONE 1
#define TWO 2
#define THREE 3
#include <stdio.h>
int a = 1; // Defining declarations
int b = 2; // of external variables
extern int max( int a, int b ); // Function prototype
int main() // Function definition
{ // for main function
int c; // Definitions for
int d; // two uninitialized
// local variables
extern int u; // Referencing declaration
// of external variable
// defined elsewhere
static int v; // Definition of variable
// with continuous lifetime
int w = ONE, x = TWO, y = THREE;
int z = 0;
z = max( x, y ); // Executable statements
w = max( z, w );
printf_s( "%d %d\n", z, w );
return 0;
}
/****************************************************************
FILE2.C - definition of max function
****************************************************************/
int max( int a, int b ) // Note formal parameters are
// included in function header
{
if( a > b )
return( a );
else
return( b );
}
FILE1.C 包含 max 函数的原型。 这种声明有时称为“前向声明”,因为该函数在使用之前被声明。
main 函数的定义包含对 max 的调用。
以 #define 开始的行是预处理指令。 这些指令告知预处理器通过 FILE1.C.用数字 ONE、TWO 和 THREE 分别替换标识符 1、2 和 3。 但是,此类指令不适用于 FILE2.C,将单独对其进行编译,然后将其与 FILE1.C 链接。 以 #include 开始的行告知编译器包含文件 STDIO.H,该文件包含 printf 函数的原型。
预处理器指令在《预处理器参考》 中进行了解释。
FILE1.C 使用定义声明初始化全局变量 a 和 b。 声明但不初始化局部变量 c 和 d。 为所有这些变量分配存储。 静态和外部变量 u 和 v 将自动初始化为 0。 因此,仅 a、b、u 和 v 在被声明时包含有意义的值,因为它们被显式或隐式初始化。 FILE2.C 包含 max 的函数定义。 此定义满足 FILE1.C. 中对 max 的调用。
生存期、范围、可见性和链接中讨论了标识符的生存期和可见性。 有关函数的详细信息,请参阅函数。