C语言预处理器的几个命令

C语言预处理器是个简单的的宏处理器,预处理器用特殊的命令行控制,这些命令行以#开头,不包含预处理器命令的行称为源程序文本行。预处理器通常从源文件中删除所有预处理器命令行,并按预处理器命令指示对源文件进行其它转换,然后,得到的经过预处理的源文本成为有效C语言程序。

下面是常见的预处理器命令:

#define——定义预处理器宏,如果是函数式宏定义,左括号与宏名之间不能有空格,所有参数及整个宏替换最好分别放在圆括号里,参数可以是可变参数表,以...表示,用__VA_ARGS__替换,传人参数包含自赠自减运算符时会带来副作用,还需注意的是宏定义结束处的分隔符。

#undef——取消预处理器宏定义。

#include——插入另一源文件中的文本。

#if——根据常量表达式值有条件地包括一些文本。

#ifdef——根据是否定义宏有条件地包括一些文本。

#ifndef——根据与#define相反的测试有条件地包括一些文本。

#else——上述#if、#ifdef、#ifndef或#elif测试失败时包括一些文本。

#endif——终止条件文本。

#line——提供编译器消息的行号。

#elif——上述#if、#ifdef、#ifndef或#elif测试失败时根据另一常量表达式值包括一些文本。

defined——预处理器函数,在一个名称定义为预处理器宏时为1,否则为0,在#if与#elif中使用。

#运算符——将宏参数换成包含参数值的字符串常量。

##运算符——从两个相邻记号生成一个记号。

#pragma——对编译器指定相关消息,效果同C99增加的_Pragma运算符。#pragma可以单独放在一行,其预处理器记号不随宏扩展,而_Pragma可以放在其它表达式中间,可以通过宏扩展产生。

#error——将编译错误换成指定消息。

标准C语言预处理器要求定义某些对象式宏,每个预定义宏的名称以两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义。

下面是常见的预定义宏——

__LINE__:当前源程序行的行号,表示为十进制整形常量。

__FILE__:当前源文件名,表示为字符串型常量。

__DATE__:转换的日历日期,表示为"MM
dd yyyy"形式的字符串型常量,MM是由asctime产生的。

__TIME__:转换的时间,表示为"hh:mm:ss"形式的字符串型常量,是由asctime产生的。

__STDC__:编译器为ISO兼容实现时为十进制整形常量1。

__STDC_VERSION__:如果实现符合C89增补1,则这个宏的值为199409L;如果实现符合C99,则这个宏的值为199901L;否则数值是未定义。

__STDC_HOSTED__:(C99)实现为宿主实现时为1,实现为独立实现时为0。

__STDC_IEC_559__:(C99)浮点数实现符合IEC
60559标准时定义为1,否则数值是未定义。

__STDC_IEC_559_COMPLEX__:(C99)复数运算实现符合IEC
60559标准时定义为1,否则数值是未定义。

__STDC_ISO_10646__:(C99)定义为长整型常量,yyyymmL表示wchar_t值符合ISO
10646标准及其指定年月的修订补充,否则数值未定义。

另外,实现还经常定义其它宏用于传递环境消息,如进行程序编译工作的计算机类型。具体定义哪些宏是由实现决定的,但UNIX实现习惯上预定义unix。与内置宏不同的是,这些宏可以取消定义。标准C语言要求特定实现的宏名以下划线开头,加上大写字母或另一个下划线(unix宏不符合这个要求)。

C99定义了几个标准杂注,FF_CONTRACT、FENV_ACCESS和CX_LIMITED_RANGE,它们取一个参数作为开关:ON、OFF、DEFAULT。

预定义标识符尽管不是关键字,但C99中引入了预定义标识符的概念,并定义了一个预定义标识符:__func__。与预定义宏不同的是,预定义标识符可以采用正常的标识符作用域规则,和关键字一样,预定义标识符不能由编程人员定义。

C++使用C89预处理器,因此C语言与C++之间差别不大。宏__cplusplus是C++实现中预定义的,可以在C和C++环境中的源文件中使用。这个名称不符合预定义宏的标准C语言拼写规则,但与现有C++实现兼容。在标准C语言中,它的值为199711L之类的版本号。__STDC__是否在C++环境中定义取决于实现。标准C语言与C++有一定差别,因此不知道是否要定义__STDC__。

时间: 2024-10-12 03:36:00

C语言预处理器的几个命令的相关文章

C语言预处理器命令详解【转】

本文转载自:http://www.cnblogs.com/clover-toeic/p/3851102.html 一  前言 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置. 预处理是C语言的一个重要功能,它由预处理程序负责完成.当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译. C语言提供多种预处理功能,主要处理#开始的预编

【转载】GCC 预处理器选项

预处理器选项(Preprocessor Option) 下列选项针对C预处理器,预处理器用在正式编译以前,对C 源文件进行某种处理. 如果指定了`-E'选项, GCC只进行预处理工作.下面的某些选项必须和`-E'选项一起才 有意义,因为他们的输出结果不能用于编译. -include file 在处理常规输入文件之前,首先处理文件file,其结果是,文件file的内容先得到编译. 命令行上任何`-D'和`-U'选项永远在`-include file'之前处理, 无论他们在命令行上的顺序如何.然而`

[精通Objective-C]预处理器

[精通Objective-C]预处理器 参考书籍:<精通Objective-C>[美] Keith Lee 目录 精通Objective-C预处理器 目录 预处理器概述 预处理器语言 预处理器指令 宏 预处理器概述 预处理根据一系列预定义规则,使用一些字符序列替换输入的字符序列.这些操作主要分为以下三步: Created with Rapha?l 2.1.0输入源文件执行文本翻译将输入的源文件拆分成多个记号将输入代码转换为预处理器语言 1.文本翻译:预处理会将输入的源文件拆分成代码行.使用单个

[转] C++的预处理及预处理器

C++的预处理(Preprocess),是指在C++程序源代码被编译之前,由预处理器(Preprocessor)对C++程序源代码进行的处理.这个过程并不对程序的源代码进行解析,但它把源代分割或处理成为特定的符号用来支持宏调调用. 常用的C++预处理 1)常用的预处理: #include 包含头文件 #if 条件 #else 否则 #elif 否则如果 #endif 结束条件 #ifdef 或 #if defined 如果定义了一个符号, 就执行操作 #ifndef 或 #if !defined

C语言难点2之预处理器

C语言难点2之预处理器 1 预处理阶段 在预处理阶段中,C预处理器在源代码编译之前对其进行一些文本性质的操作.它的主要任务包括删除注释,插入被#include指定包含的文件的内容,定义和替换由#define指令定义的符号一起确定代码的部分内容是否应该根据一些条件编译指令进行编译. 2 #define命令 采用宏定义时候的易错点: 格式: #define  name  stuff 有了这条指令之后,每当有符号name出现在这条指令后面时,预处理器就会把它替换成stuff. 注意:宏定义后面不能加上

【腾讯开源】前端预处理器语言图形编译工具 Koala使用指南

摘要:Koala是一款预处理器语言图形编译工具,支持Less.Sass.CoffeeScript.Compass框架的即时编译.无需手动输入命令去编译,后台监听文件是否有改变,如有修改会自动进行编译,能够大大提升Web开发中的工作效率. 近期,我们对腾讯Koala团队进行了专访 ,一款预处理器语言图形编译工具,支持Less.Sass.CoffeeScript.Compass框架的即时编译.本篇文章为大家着重介绍Koala工具的使用进行讲解,以供参考. Koala代码托管地址: https://c

C#预处理器命令

在最开始接触预处理指令时,是使用#region和#endregion,可以折叠代码块,方便查看.使用它可以将隶属于一个小模块的内容放到一起,折叠起来,只有在查看的时候再打开,有强迫症的应该会很喜欢.看书刚好翻到了这,就把这部分记录下来,给自己提个醒. 预处理器指令不会转化为可执行代码,而是影响代码的编译过程,可以有选择性的进行编译,这里就有一个条件编译的概念.按我的理解,就是可执行文件生成后,预处理器命令就不存在了,它影响的是生成可执行文件的过程,它告诉编译器哪些代码需要编译,哪些代码不需要.它

C预处理器

C预处理器是一种简单的宏处理器. 预处理器是由特殊的预处理器命令行控制的,它们是以#符号开头的源文件行. 预处理器的一般操作:从源文件中删除所有的预处理器命令行,并在源文件中执行这些预处理器命令所指定的转换操作 预处理器代码行的语法与C语言其他部分的语法是完全独立的,但经过预处理所产生的源代码必须在上下文环境中合法 常见的预处理器命令: #define  定义一个预处理器宏   #undef     取消一个预处理器宏 #include   插入另一个源文件的文本 #if        测试一个

C和C++的面向对象专题(8)——更为高级的预处理器PHP

本专栏文章列表 一.何为面向对象 二.C语言也能实现面向对象 三.C++中的不优雅特性 四.解决封装,避免接口 五.合理使用模板,避免代码冗余 六.C++也能反射 七.单例模式解决静态成员对象和全局对象的构造顺序难题 八.更为高级的预处理器PHP 八.更为高级的预处理器PHP C++的宏在某些情况下非常难用,例如将代码展开成为这样: Macro( A, B, C, D ) => func("A", A); func("B", B); func("C&