about 预处理

来源:互联网 发布:火箭联盟 知乎 编辑:程序博客网 时间:2024/06/03 23:44

首先说明什么是预处理器

1,
首先说明什么是预处理器:
预处理器指示符用"#"号标识,这个符号将放在程序中该行的最起始的一列上,处理这些指示符的程序称
做预处理器(preprocessor)(通常捆绑在编译器中)
#ifndef BOOK_STORE_H
#define BOOK_STORE_H
...
#endif
一个头文件可能会多次包含在一个源文件中,条件指示符可以防止这种头文件的重复处理;
条件指示符#ifndef检查BOOK_STORE_H在前面是否已经被定义。这里BOOK_STORE_H是一个预编译器常量
(习惯上,预编译器常量往往被写成大写字母)。如果BOOK_STROE_H在前面没有被定义,则条件指示符的
值为真,于是从#ifndef 到 #endif之间的所有语句都被包含进来进行处理,相反,如果#ifndef的值为假
,则它与#endif指示符之间的部分将被忽略。
为了保证头文件只被处理以一次,把如下#define指示符:
#define BOOK_STORE_H
放在#ifndef后面,这样在头文件的内容第一次被处理时,BOOK_STORE_H将被定义,从而防止了在程序文
本文件中以后#ifndef指示符的值为真。
2,#ifdef 指示符常被用来判断一个预处理器常量是否已经被定义,以便有条件的包含程序代码;
#ifdef DEBUG
dosomething();
#endif
3,编译C++程序的时候,编译器自动定义了一个预处理器名字__cplusplus(注意前面有两个下划线)。
因此,我们可以根据它来判断该程序是否时C++程序,以便有条件地包含一些代码;例如
#ifdef __cplusplus
   extern "C"
#endif
int min(int,int)
在编译C程序地时候,编译器将自动定义名字__STDC__。当然__cplusplus和__STDC__不会被同时定义;

4,另外两个比较有用地预定义名字是:__LINE__和 __FILE__。前者记录文件已经被编译的行数,后者
包含正在被编译的文件的名字。可以这样使用他们:
if(element_count==0)
cerr<<"Error:"<<__FILE__
    <<": Line"<<__LINE__
    <<"element _count must be non-zero./n";
若当前处理的行或文件发生变化,则__LINE__ 和__FILE__的值将被分别变化,其他四个预定义名字在
编译期间保持不变。他们的值也不能被修改;
5,另外两个预定义名字分别包含当前被编译文件的编译时间(__TIME__)和日期( __DATA__)。时间
格式是hh:mm:ss.

6,assert()是C语言标准库中提供的一个通用预处理器宏。在代码中常利用assert()来判断一个必须的
前提条件,以便程序能够正确执行。比如我们要打开一个文件,那么首先文件名应该已经提供给我们了,
为了使用 assert(),必须包含与之相关的头文件: #include下面是一个简单的例子:
assert(filename!=0)
assert()将测试filename不等于0的条件是否满足,这表示,为了后面的程序能够正确执行,我们必须
断言一个必须的前提条件,如果这个条件为假的话,断言失败,则程序将输出诊断信息,然后中止;使用
assert() ,C++的头文件必须这样写:
#include
using namespace std;