替换后的结果将交给C编译程序进行编译,至于 宏展开后的结果形式是否符合C语言语法规则,将由 C编译程序检查语法上的正确性。 例如将上例子写成为: # define tabsize100;/以分号结束* 则宏展开后变成为: int table [ 100; i C编译程序将指出其错误,但预处理程序不管
11 替换后的结果将交给C编译程序进行编译,至于 宏展开后的结果形式是否符合C语言语法规则,将由 C编译程序检查语法上的正确性。 例如将上例子写成为: #define TABSIZE 100; /*以分号;结束*/ 则宏展开后变成为: int table [100;] ; C编译程序将指出其错误,但预处理程序不管
宏展开工作是在内存中进行的,因此并不改变源 文件本身,程序设计者也不能直接见到宏展开后 的结果形式。 某些C编译系统提供专用工具,用以查看宏展开 后的结果形式。若上例存放在ilec中,则可在命令 行上打入如下命令: cppP-flec/*P为大写* 将产生的宏展开后的结果文件file.I。相关内容请 查阅所用C编译系统的用户手册。 12
12 宏展开工作是在内存中进行的,因此并不改变源 文件本身, 程序设计者也不能直接见到宏展开后 的结果形式。 某些C编译系统提供专用工具,用以查看宏展开 后的结果形式。若上例存放在file.c中,则可在命令 行上打入如下命令: cpp -P- file.c /* P为大写 */ 将产生的宏展开后的结果文件 file.I 。相关内容请 查阅所用C编译系统的用户手册
若宏主体比较长,在一行上写不下换行书写不 能简单地按回车换行书写(因预处理命令行总是以 新行字符结束) 正确的续行书写方法是在适当的位置断开,并在 断开处插入一个反斜杠“字符后再按回车而把 断 例如: 开点后的那部分内容写入到下一行中 #define mac aaaaaaaaaaabbbbbbbl ccccc main char str 30=mac i printf( %osIn, str) 13
13 若宏主体比较长,在一行上写不下,换行书写不 能简单地按回车换行书写 (因预处理命令行总是以 新行字符结束)。 正确的续行书写方法是在适当的位置断开,并在 断开处插入一个反斜杠 “\” 字符后再按回车,而把 断 开点后的那部分内容写入到下一行中去。 例如: #define mac “aaaaaaaaaaabbbbbbb\ ccccc ” main ( ) { char str[30]=mac ; printf(“ %s\n ” , str ) ; }
预处理程序允许在一个类对象宏定义命令行中使 用先前已定义过的宏名。例如 #define up 2 #define dn (2+ UP) #define hi dn/2 main( float area area=((UP+ DN)* HI)/2; area=((2+(2+2))(2+2)/2)/2;
14 #define UP 2 #define DN ( 2 + UP ) #define HI DN / 2 main ( ) { float area ; area = ( ( UP + DN ) * HI ) / 2 ; ┇ } 预处理程序允许在一个类对象宏定义命令行中使 用先前已定义过的宏名。例如: area = ( ( 2 + ( 2 + 2 ) ) * ( 2 + 2 ) / 2 ) / 2 ;
宏名的有效范围是从它的定义点开始到它所在 源文件的未尾。但可用#unde预处理命令来改变 一个宏名的作用域,使宏名局部化。 # undef预处理命令的作用是用来取消前面定 义过的某个宏名的定义。它的一般形式为: # undef宏名 其中“宏名”为前面已定义过的而在这里要被取 消其定义的宏名。 例如: 15
15 宏名的有效范围是从它的定义点开始到它所在 源文件的未尾。 但可用#undef预处理命令来改变 一个宏名的作用域, 使宏名局部化。 #undef 预处理命令的作用是用来取消前面定 义过的某个宏名的定义。它的一般形式为: #undef 宏名 其中“宏名”为前面已定义过的而在这里要被取 消其定义的宏名。 例如: