C++的预处理器指示符

      头文件通过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, 断言失败,则程序将输出诊断消息然后终止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值