`

C++的预处理器指示符

阅读更多
<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

头文件通过include 预处理器指示符preprocessor include directive 而成为我们程序的一部分。

有两种定义头文件的方法:

#include <some_file.h>
#include "my_file.h"

如果文件名用尖括号“<” 和“>” 括起来表明这个文件是一个工程或标准头文件查找过程会检查预定义的目录。我们可以通过设置搜索路径环境变量或命令行选项来修改这些目录。

被包含的文件还可以含有#include 指示符,由于嵌套包含文件的原因,一个头文件可能会被多次包含在一个源文件中条件指示符可防止这种头文件的重复处理,例如

#ifndef BOOKSTORE_H
#define BOOKSTORE_H
/* Bookstore.h 的内容 */
#endif

条件指示符#ifndef 检查BOOKSTORE_H 在前面是否已经被定义,这里BOOKSTORE_H是一个预编译器常量(习惯上预编译器常量往往被写成大写字母)。

如果BOOKSTORE_H在前面没有被定义则条件指示符的值为真于是从#ifndef 到#endif 之间的所有语句都被包含进来进行处理相反如果#ifndef 指示符的值为假则它与#endif 指示符之间的行将被忽略。

为了保证头文件只被处理一次,把如下#define 指示符
#define BOOKSTORE_H
放在#ifndef 后面,这样在头文件的内容第一次被处理时,BOOKSTORE_H 将被定义从而防止了在程序文本文件中以后#ifndef 指示符的值为真,只要不存在“两个必须包含的头文件要检查一个同名的预处理器常量”这样的情形,这个策略就能够很好地运作。

在编译C++程序时,编译器自动定义了一个预处理器名字__cplusplus(注意前面是两个下划线)。因此我们需要判断程序是否为C++程序,以便有条件地包含一些代码。

#ifdef __cplusplus
// 不错我们要编译C++
// extern "C"
extern "C"
#endif
int min( int, int );

在编译C程序时,编译器将自动定义名字_STDC_。当然__cplusplus和_STDC_不会同时被定义。

另外两个比较有用的预定义名字是__LINE__和__FILE__。 __LINE__记录文件已经被编译的行数,__FILE__包含正在被编译的文件的名字,可以这样使用它们
if ( element_count == 0 )
cerr << "Error: " << __FILE__
<< " : line " << __LINE__
<< "element_count must be non-zero.\n";
另外两个预定义名字,分别包含当前被编译文件的编译时间__TIME__ 和日期__DATE__ 。时间格式为 hh:mm:ss

因此如果在上午8 点17 分编译一个文件,则时间表示为08:17:05。如果这一天是1996 年10 月31 日星期四则日期表示为
Oct 31 1996

若当前处理的行或文件发生变化则__LINE__和__FILE__的值将分别被改变,其他四个预定义名字在编译期间保持不变它们的值也不能被修改。

assert()是C 语言标准库中提供的一个通用预处理器宏。在代码中常利用assert()来判断一个必需的前提条件以便程序能够正确执行。例如,假定我们要读入一个文本文件,并对其中的词进行排序,必需的前提条是文件名已经提供给我们了,这样我们才能打开这个文件,为了使用assert(), 必须包含与之相关联的头文件
#include <assert.h>

下面是一个简单的使用示例
assert( filename != 0 );

assert()将测试filename 不等于0 的条件是否满足,这表示为了后面的程序能够正确执行。我们必须断言一个必需的前提条件,如果这个条件为假,即filename 等于0, 断言失败,则程序将输出诊断消息然后终止。

分享到:
评论

相关推荐

    visual c++ 6.0预处理器参考手册

    4. **文件和行指示符(File and Line Directives)**:`#file`和`#line`可以用来获取当前处理的文件名和行号,常用于调试和错误信息报告。 5. **字符串化(Stringification)**:`#`操作符可以把宏参数转换为字符串...

    C++Primer读书笔记:C++概述.pdf

    C++Primer中文第三版(C++从入门到精通)第一章的读书笔记,主要是C++程序、预处理器指示符、iostream库等的基础知识点读书笔记。

    电子功用-文本指示符方法和电子设备

    6. **硬件设计**:在电子设备硬件层面,文本指示符的显示可能涉及到显示屏控制器、图形处理器(GPU)以及相关的电源管理电路。设计师必须考虑到功耗、分辨率、刷新率等因素,以确保文本指示符的清晰可见和高效运行。...

    C++primer笔记

    预处理器指示符 - **预处理器**:预处理器是一个独立于编译器的工具,用于处理源代码中的特定指令。预处理器指令通常以`#`字符开头。 - **#include**:用于包含其他文件,有两种形式: - `#include &lt;filename&gt;`...

    Micrososft Visual C++6.0语言参考手册

    它详细说明了Visual C++6.0的预处理器功能和预处理器编译器的编译指示指令以及语法总结。预处理器是C++语言中一个非常重要的组成部分,它在源代码编译之前进行处理,为编译过程做准备。 整本书不仅提供了详尽的语言...

    C++ primer总结报告

    1.3 预处理器指示符 预处理器(Preprocessor)是编译过程的第一步,负责处理#include、define等指令,将源代码转换为预处理后的形式。 1.4 注释 注释是程序员用于解释代码的文本,C++中的单行注释以`//`开始,多行...

    The C++ Programming Language 3rd 中文版

    9. **内存管理**:C++提供了动态内存分配和释放的功能,如new和delete操作符。书中会讨论内存管理策略,包括智能指针(如auto_ptr、unique_ptr和shared_ptr)的使用。 10. **预处理器**:预处理器在编译前对源代码...

    在 Visual C++ 中使用内联汇编

    尽管如此,内联汇编支持EVEN和ALIGN指示符,它们可以通过插入NOP指令确保代码在特定边界对齐,提高某些处理器的指令加载效率。 #### 段引用 内联汇编中,段必须使用寄存器而非名称引用,段跨越需明确声明。 #### ...

    Microsoft Visual C 6.0语言参考手册

    本书是美国微软出版社授权的Microsoft Visual Studio系列中文版图书之一,它是...第三部分Visual C++ 6.0预处理器参考手册,分3章和1个附录,给出了C++ 6.0的预处理器和预处理器的编译器的编译指示指令以及语法总结。

    C++ Primer读后总结

    - 预处理器指令是C++源代码中以`#`字符开头的特殊命令。它们在编译过程之前由预处理器处理。 - 常见的预处理器指令包括`#include`用于引入头文件,`#define`用于定义宏等。 - `#include &lt;iostream&gt;`:此指令告诉预...

    《零基础写c语言程序设计》

    3.5编译器如何认识printf函数-#include预处理器指示符 3.6计算1+1-有些小作为的程序 3.7数据从哪里来,又到哪里去-变量 3.8自己设计c函数 3.9语句构成程序 3.10向好程序员看齐-代码风格 3.11小结 第四章:如何存取和...

    在Visual_C++中使用内联汇编

    4. **EVEN和ALIGN指示符**:这些指示符可以确保代码对齐到特定的边界,提高某些处理器的效率。 5. **MASM宏指示符**:内联汇编不支持MASM的宏指令。 6. **段说明**:必须使用寄存器来指定段。 7. **类型和变量大小**...

    c++ 词法分析器

    7. **预处理器指令**:C++ 的预处理器指令,如 `#include`, `#define` 和 `#ifdef`,在词法分析阶段也会被处理。 在构建词法分析器时,通常会使用正则表达式来匹配不同类型的符号。对于更复杂的规则,可以使用状态...

    2022年在Visual C++中使用内联汇编C语言教程.docx

    需要注意的是,内联汇编不支持大多数 MASM 指示符,但支持 EVEN 和 ALIGN 指示符,可以在汇编代码中加入 NOP 指令使标号对齐到特定边界,以提高某些处理器的执行效率。 在内联汇编中,需要使用寄存器来说明段,跨越...

    C++基础学习教程笔记

    2. 预处理器指令:`#include &lt;iostream.h&gt;`是预处理器指令,告诉编译器将`iostream.h`头文件包含进程序。`iostream.h`包含了C++标准输入输出流的声明,使得我们可以使用`cout`进行输出。 3. 使用命名空间:`using ...

    c++错误代码全部介绍

    为了解决这个问题,需要明确地使用括号来指示操作符的应用顺序。 2. **Ambiguous symbol 'xxx'**(符号'xxx'含糊不清) 此错误表明标识符“xxx”在当前作用域中有多个定义或声明,导致编译器无法确定应使用哪一个...

    在Visual C++中使用内联汇编

    在`__asm`块中,也可以混用C/C++的元素,如符号(变量、标号和函数名)、常量、宏定义、预处理指示符、注释,甚至类型名。这种混合编程的能力使得内联汇编成为解决特定问题的强大工具。 然而,由于内联汇编的局限性...

    Hello World.rar_c++ hello world_world

    1. `#include &lt;iostream&gt;`:这是预处理器指令,用于引入C++的输入/输出流库。`iostream`库包含了`cin`(标准输入)和`cout`(标准输出)对象,它们是进行基本输入输出操作的关键。 2. `int main()`:这是C++程序的...

Global site tag (gtag.js) - Google Analytics