14.5 其他指令
当程序编译之后,#error指令允许生成错误信息。下面是它的语法:
#error text of error message
下面的代码段显示了可以如何使用这个指令:
#if defined( OPTION_A )
stuff needed for option A
#elif defined( OPTION_B )
stuff needed for option B
#elif defined( OPTION_C )
stuff needed for option C
#else
#error No option selected
#endif
/*
** 其他指令。
*/
#include <stdio.h>
#include <stdlib.h>
int main( void ){
#if defined( OPTION_A )
printf( "OPTION_A is defined.\n" );
#elif defined( OPTION_B )
printf( "OPTION_B is defined.\n" );
#elif defined( OPTION_C )
printf( "OPTION_C is defined.\n" );
#else
#error No option selected!
#endif
return EXIT_SUCCESS;
}
/* 输出:

*/
另外还有一种用途较小的#line指令,它的形式如下:
#line number "string"
它通知预处理器number是下一行输入的行号。如果给出了可选部分“string”,预处理器就把它作为当前文件的名字。值得注意的是,这条指令将修改__LINE__符号的值,如果加上可选部分,它还将修改__FILE__符号的值。
这条指令最常用于把其他语言的代码转换为C代码的程序。C编译器产生的错误可以引用源文件(而不是翻译程序产生的C中间源文件)的文件名和行号。
/*
** #line。
*/
#include <stdio.h>
#include <stdlib.h>
int main( void ){
printf( "original __LINE__ = %d, __FILE__ = %s\n", __LINE__, __FILE__ );
#line 12 "other_instruction_#LINE"
printf( "original __LINE__ = %d, __FILE__ = %s\n", __LINE__, __FILE__ );
return EXIT_SUCCESS;
}
/* 输出:

*/
#progma指令是另一种机制,用于支持因编译器而异的特性。它的语法也是因编译器而异。有些环境可能提供一些#progma指令,允许一些编译器选项或其他方法无法实现的一些处理方式。例如,有些编译器使用#progma指令在编译过程中打开或关闭清单显示,或者把汇编代码插入到C程序中。从本质上说,#progma是不可移植的。预处理器将忽略它不认识的#progma指令,两个不同的编译器可能以两种不同的方式解释同一条#progma指令。
最后,无效指令(null directive)就是以#符号开头,但后面不跟任何内容的一行。这类指令只是被预处理简单地删除。下面例子中的无效指令通过把#include与周围的代码分隔开来,凸显它的存在:
#
#include<stdio.h>
#
我们也可以通过插入空行取得相同的效果。
/*
** #。
*/
#
#include<stdio.h>
#
#include <stdlib.h>
int main( void ){
printf( "EOF = %d\n", EOF );
return EXIT_SUCCESS;
}
/* 输出:

*/