C++中的预处理(下)

原创 2003年07月07日 09:23:00

其他预编译指令
    除了上面我们说的集中常用的编译指令,还有3种不太常见的编译指令:#line、#error、#pragma,我们接下来就简单的谈一下。
    #line的语法如下:
      #line number filename
    例如:#line 30  a.h     其中,文件名a.h可以省略不写。
    这条指令可以改变当前的行号和文件名,例如上面的这条预处理指令就可以改变当前的行号为30,文件名是a.h。初看起来似乎没有什么用,不过,他还是有点用的,那就是用在编译器的编写中,我们知道编译器对C++源码编译过程中会产生一些中间文件,通过这条指令,可以保证文件名是固定的,不会被这些中间文件代替,有利于进行分析。
    #error语法如下:
        #error  info
    例如:#ifndef UNIX
             #error This software requires the UNIX OS.
           #endif
    这条指令主要是给出错误信息,上面的这个例子就是,如果没有在UNIX环境下,就会输出This software requires the UNIX OS.然后诱发编译器终止。所以总的来说,这条指令的目的就是在程序崩溃之前能够给出一定的信息。
    至于#pragma,我们在《解析#pragma指令 》一文中有过介绍,我们在这里再补充几句,#pragma是非统一的,他要依靠各个编译器生产者,例如,在SUN C++编译器中:
         // 把name和val的起始地址调整为8个字节的倍数
         #progma align 8 (name, val)
         char   name[9];
         double val;

        file://在程序执行开始,调用函数MyFunction
        #progma init (MyFunction)

预定义标识符
    为了处理一些有用的信息,预处理定义了一些预处理标识符,虽然各种编译器的预处理标识符不尽相同,但是他们都会处理下面的4种:
    __FILE__  正在编译的文件的名字
    __LINE__  正在编译的文件的行号
    __DATE__  编译时刻的日期字符串,例如: "25 Dec 2000"
    __TIME__  编译时刻的时间字符串,例如: "12:30:55"
    例如:cout<<"The file is :"<<__FILE__"<<"! The lines is:"<<__LINE__<<endl;

预处理何去何从
    在《浅析C++里面的宏》一文中,我们提到了如何取代#include预处理指令,我们在这里就不再一一讨论了。
    C++并没有为#include提供替代形式,但是namespace提供了一种作用域机制,它能以某种方式支持组合,利用它可以改善#include的行为方式,但是我们还是无法取代#include。
    #progma应该算是一个可有可无的预处理指令,按照C++之父Bjarne的话说,就是:“#progma被过分的经常的用于将语言语义的变形隐藏到编译系统里,或者被用于提供带有特殊语义和笨拙语法的语言扩充。”
    对于#ifdef,我们仍然束手无策,就算是我们利用if语句和常量表达式,仍然不足以替代她,因为一个if语句的正文必须在语法上正确,满足类检查,即使他处在一个绝不会被执行的分支里面。
    最后,我们以Bjarne博士的话作为结尾:“最后---在许多年之后---将Cpp放逐刀程序开发环境里,与其它附加性语言工具放到一起,那里才是她应该呆的地方。”

C++/C中的预处理命令;

分析>: 预编译又称为预处理 ,是做些代码文本的替换工作。处理 # 开头的指令 , 比如拷贝 #include 包含的文件代码, #define 宏定义的替换 , 条件编译等,就是为编译做的预备工...
  • zdplife
  • zdplife
  • 2016年03月12日 12:10
  • 665

C++ 高级篇(五)—— 预处理指令

预处理指令是我们写在程序代码中的给预处理器(preprocessor)的 命令,而不是程序本身的语句。预处理器在我们编译一个C++程序时由编译器自动执行,它负责控制对程序代码的第一次验证和消化。 所有...
  • zqixiao_09
  • zqixiao_09
  • 2016年05月23日 19:11
  • 2391

c++预处理命令

C预处理命令 一.什么是预处理命令   简单的说,预处理就是为了提高编程效率,在对程序编译之前,注意是编译之前了,根据预处理命令进行相应的处理。预处理命令包括:#define,#include,#...
  • jiangliuzheng
  • jiangliuzheng
  • 2013年01月16日 11:47
  • 1503

C++_3种预处理功能

1.文件包含#include 作用:把指定的源文件或头文件的全部内容包含到当前文件中。 形式1:#include,直接按系统标准方式检索文件目录。 形式2:#include"文件名",在当前的源...
  • GSH_Hello_World
  • GSH_Hello_World
  • 2016年10月16日 22:28
  • 593

c++中预处理变量#define#ifndef#endif的作用

我们在编写程序时,同时包含一个头文件多次是一件常见的事情,当然同时多次包含一个头文件可能会引起不必要的错误。使得头文件安全的通用做法,是使用预处理器定义头文件保护符。头文件保护符用于避免在已经见到头文...
  • u010213393
  • u010213393
  • 2014年10月28日 21:16
  • 1303

C++预处理程序

分类: Linux c++开发 电子书 2013-09-11 21:17 276人阅读 评论(0) 收藏 举报 目录(?)[+] C++应用程序开发中离不开预处理程序...
  • tangzhilinhk
  • tangzhilinhk
  • 2014年07月10日 11:52
  • 501

C++连接Mysql数据库 & 使用预处理读写BLOB

通常C++链接mysql你每次都需要转换数据,传指针,传大小等一系列复杂操作,是不是顺序很混乱,过程很繁杂。mysql也为你提供了另外一种方法,那就是MYSQL_BIND。将数据操作统一化,统一麻烦化...
  • u012724150
  • u012724150
  • 2017年09月08日 11:09
  • 263

C++__函数与预处理

在一个程序文件中可以包含若干个函数。无论把一个程序划分为多少个程序模块,但只能有一个main函数。程序总是从main函数开始执行的。在程序运行过程中,由主函数调用其他函数,其他函数也可以互相调用。 ...
  • yf289178199
  • yf289178199
  • 2017年07月01日 15:30
  • 189

C++封装MySQL预处理C API

#ifndef _PRE_STATEMENT_H_ #define _PRE_STATEMENT_H_ #include "mysql.h" #include class pre_stateme...
  • peng314899581
  • peng314899581
  • 2016年08月04日 14:00
  • 1153

MySQL C API预处理函数call存储过程

drop procedure if exists SelectAll; delimiter $ create procedure SelectAll(in TableName char(64)) be...
  • peng314899581
  • peng314899581
  • 2016年10月09日 14:34
  • 891
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中的预处理(下)
举报原因:
原因补充:

(最多只允许输入30个字)