提示:主要记录学习编程的经验和个人知识点总结,好记性不如烂笔头。
提示:以下是本篇文章正文内容,主要讲 C预处理器
在编译和链接之前,还需要对源文件进行一些文本方面的操作,比如文本替换、文件包含、删除部分代码等,这个过程叫做预处理,由预处理程序完成。 C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。 注意:预处理器指令在编译之前执行。
如下:
指令描述#define定义宏#include包含一个源代码文件#undef取消已定义的宏#ifdef如果宏已定义,则返回结果为真#ifndef如果宏没有定义,则返回结果为真 提示:注意中间的n代表not#if如果条件为真,编译以下代码#else#if的替代方案,类似if …else语句#elif如果#if条件不为真,当前条件为真,则编译下面的代码 提示:理解为else if#endif结束一个#if…#else 条件编译块#else#if的替代方案 提示:类似if else语句#error当遇到标准错误时,输出错误消息#pragma使用标准化方法,向编译器发布特殊的命令到编译器中“#”表示这是预处理器命令。凡是以#开头的均为预处理命令。define为宏定义定义的宏名。字符串可以是常数、表达式、格式串等。
例如:
#define MAXNUM 99999这样MAXNUM就被简单定义为99999。
有参宏定义C++允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。 对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
带参宏定义的一般形式为:
#define 宏名(形参表) 字符串在字符串中含有各个形参。在使用时调用带参宏调用的一般形式为:宏名(实参表);
例如:
#define add(x,y) (x+y) int main() { cout << "1 plus 1 is"<< add(1,1.5)<<".\n"; //输出“1 plus 1 is 2.5.” system("pause"); return 0; }函数定义为(a+b),加括号的原因是,宏定义只是在预处理阶段做了简单的替换,如果单纯的替换为a+b,使用5add(2,3)时,被替换为52+3,而非5*(2+3),值为25.
宏定义中的特殊操作符define中的特殊操作符有#,##和…and_VA_ARGS_
#ifndef是if not defined 的简写,是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试。 这是预处理功能中三种(宏定义,文件包含,条件编译)中的第三种–条件编译。
备注:#ifndef和#endif要一起使用,如果丢失#endif,可能会报错。
#ifndef x//先测试x是否被宏定义过 #define x 程序段1//如果x没有被宏定义过,定义x,并编译程序段1 #else 程序段2//如果x已经定义过了,则编译程序段2的语句,忽视程序段1 #endif //终止if作用:条件指示符#ifndef的主要目的是防止头文件的重复包含和编译。
#ifndef效果为防止一个源文件两次包含同一个头文件,而不是防止两个源文件包含同一个头文件,头文件存在的价值就是被不同的源文件包含。
条件编译当然也可以用条件语句来实现,但是用条件语句将会对整个源程序进行编译,生成的目标代码程序很长,而采用条件编译,则根据条件只编译其中的程序段1或者程序段2,生成的目标程序较短。
#ifndef 标识1 #define 标识1 #endif 语句4; 语句5;代码意思:如果标识1没有被定义,则重新定义标识1,即执行语句2,语句3;如果标识1已经被定义,则直接跳过语句2、语句3,直接执行语句4,语句5。
如果有一个C源文件,包含了多个头文件,比如头文件A和头文件B,而头文件B包含了头文件A,则最终的效果是,该源文件包含了两次头文件A。如果头文件A定义了结构体或者类类型,编译时会报大量的重复定义错误。
如要编写头文件test.h,在头文件开头写上两行:
#ifndef _TEST_H #define _TEST_H //一般采用文件名的大写 头文件结尾写上一句: #endif 这样一个工程文件里同时包含两个两个test.h时,就不会出现重定义的错误了。标识的命名规则一般是头文件名全大写,前面加下划线,并把文件中的“.”也变成下划线,如stdio.h
#ifndef _STDIO_H #define _STDIO_H ... #endif如果 .h 文件中定义了全局变量,一个C文件包含了同一个 .h 文件多次,如果不加 #ifndef 宏定义,会出现变量重复定义的错误,如果加了 #ifndef ,则不会出现这种错误。
易百教程 W3Cschool RUNOOB C语言中文网 c/c++中define用法详解及代码示例 #ifndef
能够根据不同情况编译不同代码、产生不同目标文件的机制,称为条件编译。
条件编译允许只编译源程序中满足条件的程序段,多余的代码以及所有的宏都不会参与编译,使生成的目标程序较短,不仅保证了代码的正确性,还减小了编译后文件的体积,从而减少了内存的开销并提高了程序的效率。
使用预处理功能便于程序的修改、阅读、移植和调试,也便于实现模块化程序设计。
