#
) 开头的代码行。这些代码行不是程序语句,而是给预处理器的指令。预处理器在代码的实际编译开始之前检查代码,并在常规语句实际生成任何代码之前解析所有这些指令。;
)。让预处理器指令跨越多行的唯一方法是在行尾的换行符前加上一个反斜杠 (\
)。#define
。其语法是:#define 标识符 替换内容
identifier
(标识符)替换为 replacement
(替换内容)。这个 replacement
可以是一个表达式、一个语句、一个代码块或任何东西。预处理器本身不理解 C++,它只是简单地将所有出现的 identifier
替换为 replacement
。
|
|
TABLE_SIZE
之后,代码变得等同于:
|
|
#define
也可以与参数一起使用来定义函数宏:
|
|
getmax
出现的地方,替换为替换表达式,同时也会将每个参数替换为其标识符,正如你期望一个函数那样工作。
|
|
5 7 |
#undef
预处理器指令取消定义它为止。
|
|
|
|
#
和 ##
)。#
后面跟着一个参数名,它会被替换为一个包含传入参数的字符串字面量(就像用双引号括起来一样)。
|
|
|
|
##
连接两个参数,它们之间不留任何空格。
|
|
|
|
#ifdef
允许一段程序代码只有在作为参数指定的宏已经被定义时才被编译,无论其值是什么。例如:
|
|
int table[TABLE_SIZE];
只有在 TABLE_SIZE
之前已经用 #define
定义过才会被编译,而不管它的值是多少。如果它没有被定义,那行代码将不会被包含在程序编译中。#ifndef
的作用恰恰相反:在 #ifndef
和 #endif
指令之间的代码,只有在指定的标识符之前没有被定义时才会被编译。例如:
|
|
TABLE_SIZE
还没有被定义,那么它将被定义为 100。如果它已经存在,它将保持其先前的值,因为 #define
指令将不会被执行。#if
、#else
和 #elif
(即 "else if")指令用于指定要满足的某个条件,以使其包围的代码部分被编译。#if
或 #elif
后面的条件只能评估常量表达式,包括宏表达式。例如:
|
|
#if
、#elif
和 #else
链接起来的指令结构以 #endif
结尾。#ifdef
和 #ifndef
的行为也可以通过在任何 #if
或 #elif
指令中使用特殊运算符 defined
和 !defined
来实现。
|
|
#line
指令允许我们控制这两样东西:代码文件中的行号以及发生错误时我们希望出现的文件名。其格式为:#line 行号 "文件名"
number
(行号)是将被赋给下一行代码的新行号。后续代码行的行号将从此开始逐一增加。"filename"
(文件名)是一个可选参数,允许重新定义将要显示的文件名。例如:
|
|
"assigning variable"
的第 20 行。
|
|
__cplusplus
未定义时中止编译过程(这个宏名在所有 C++ 编译器中都是默认定义的)。#include
指令时,它会将其替换为指定的头文件或文件的全部内容。有两种使用 #include
的方式:
|
|
<>
之间。这用于包含由实现提供的头文件,例如构成标准库的头文件(iostream
, string
, ...)。这些头文件是实际的文件还是以其他形式存在是由实现定义的,但无论如何,它们都应该用这个指令正确地包含。#include
使用的语法是引号,它包含一个文件。系统会以由实现定义的方式搜索该文件,这通常包括当前路径。如果找不到文件,编译器会将该指令解释为头文件包含,就像引号 (""
) 被替换为尖括号 (<>
) 一样。#pragma
定义的可能参数的更多信息,请查阅您的编译器手册或参考资料。#pragma
的特定参数,它将被忽略——不会产生语法错误。_
开始和结束):宏 | 值 |
---|---|
__LINE__ | 代表正在编译的源代码文件中当前行的整数值。 |
__FILE__ | 一个字符串字面量,包含正在编译的源文件的假定名称。 |
__DATE__ | 一个形式为 "Mmm dd yyyy" 的字符串字面量,包含编译过程开始的日期。 |
__TIME__ | 一个形式为 "hh:mm:ss" 的字符串字面量,包含编译过程开始的时间。 |
__cplusplus | 一个整数值。所有 C++ 编译器都将此常量定义为某个值。其值取决于编译器支持的标准版本:
|
__STDC_HOSTED__ | 如果实现是托管实现(所有标准头文件都可用),则为 1 。否则为 0 。 |
宏 | 值 |
---|---|
__STDC__ | 在 C 语言中:如果定义为 1 ,则该实现符合 C 标准。在 C++ 中:由实现定义。 |
__STDC_VERSION__ | 在 C 语言中:
|
__STDC_MB_MIGHT_NEQ_WC__ | 如果多字节编码可能在字符字面量中赋予字符不同的值,则为 1 。 |
__STDC_ISO_10646__ | 一个形式为 yyyymmL 的值,指定了 wchar_t 字符编码所遵循的 Unicode 标准的日期。 |
__STDCPP_STRICT_POINTER_SAFETY__ | 如果实现具有严格指针安全性,则为 1 (参见 get_pointer_safety )。 |
__STDCPP_THREADS__ | 如果程序可以拥有多个线程,则为 1 。 |
|
|
This is the line number 7 of file /home/jay/stdmacronames.cpp. Its compilation began Nov 1 2005 at 10:12:29. The compiler gives a __cplusplus value of 1 |
![]() 异常 | ![]() 目录 | ![]() 文件输入/输出 |