灵活使用#ifdef指示符,我们可以区隔一些与特定头文件、程序库和其他文件版本有关的代码,相当于一个开关,用#define定义,存在则执行#ifdef #endif块中的内容。
#include "iostream.h"
int main()
{
#ifdef DEBUG
cout<< "Beginning execution of main()";//使用标准的输出流来做控制台的输出
#endif
return 0;
}
运行结果为:Press any key to continue
改写代码如下:
#include "iostream.h"
#define DEBUG
int main()
{
#ifdef DEBUG
cout<< "Beginning execution of main()";
#endif
return 0;
}
运行结果为:Beginning execution of main()
Press any key to continue
更一般的情况是,#define语句是包含在一个特定的头文件中。
比如,新建头文件head.h,在文件中加入代码:
#ifndef DEBUG
#define DEBUG
#endif
代码修改如下:
#include "iostream.h"
#include "head.h"
int main(){
#ifdef DEBUG
cout<< "Beginning execution of main()";
#endif
return 0;
}
运行结果如下:Beginning execution of main()
Press any key to continue
结论:通过使用#ifdef指示符,我们可以区分一些与特定头文件、程序库和其他文件版本有关的代码。
预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作。就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译。这样做的好处是,经过处理后的代码,将会变的很精短。
凡事以#开头的code均为预处理命令,define为宏定义命令
#define 标识符 字符串 eg:
#define CM_COMMAND_NOTE 0x000U
程序中遇到CM_COMMAND_NOTE 的地方都会由0x000U代替
条件编译的几种情况:
情况一:
#ifdef _XXX
...程序段1...
#else
...程序段2...
#endif
这表明如果标识符XXX已被#define命令定义过,则对程序段1进行编译;否则对程序段2进行编译。
情况二:
#ifndef _XXXX
...程序段1...
#else
...程序段2...
#endif
如果没有定义标识符XXXX,那么执行程序段1,否则执行程序段2。
情况三:
#if 常量
...程序段1...
#else
...程序段2...
#endif
这里表示,如果常量为真(非0,随便什么数字,只要不是0),就执行程序段1,否则执行程序段2。
这种方法可以将测试代码加进来。当需要开启测试的时候,只要将常量变1,而不要测试的时候,只要将常量变0。
情况四:
头文件中的#ifndef -->
如果有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。这样最好把头文件的内容都放在#ifndef和#endif中。不管头文件会不会被多个文件引用,都要加上这个。
一般格式是这样的:
#ifndef <标识>
#define <标识>
......
......
#endif
<标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h
#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif
情况五:
在#ifndef中定义变量出现的问题(一般不定义在#ifndef中)。
#ifndef AAA
#define AAA
...
int i;
...
#endif
里面有一个变量定义
在vc中链接时就出现了i重复定义的错误,而在c中成功编译。
结论:
(1).当你第一个使用这个头的.cpp文件生成.obj的时候,int i 在里面定义了当另外一个使用这个的.cpp再次[单独]生成.obj的时候,int i 又被定义然后两个obj被另外一个.cpp也include 这个头的,连接在一起,就会出现重复定义.
(2).把源程序文件扩展名改成.c后,VC按照C语言的语法对源程序进行编译,而不是C++。在C语言中,若是遇到多个int i,则自动认为其中一个是定义,其他的是声明。
(3).C语言和C++语言连接结果不同,可能(猜测)时在进行编译的时候,C++语言将全局
变量默认为强符号,所以连接出错。C语言则依照是否初始化进行强弱的判断的。(参考)
解决方法:
(1).把源程序文件扩展名改成.c。
(2).推荐解决方案:
.h中只声明 extern int i;在.cpp中定义
<x.h>
#ifndef __X_H__
#define __X_H__
extern int i;
#endif //__X_H__
<x.c>
int i;
注意问题:
变量一般不要定义在.h文件中。
转自
http://hi.baidu.com/taney/blog/item/1a06abee1763d92a2df534b7.html
分享到:
相关推荐
本章主要讨论了预处理中的两个关键概念:文件包含命令`#include`和宏定义`#define`,以及条件编译指令。 文件包含命令`#include`用于将其他文件的内容插入到当前源文件中,以实现代码的复用。有两种调用方式: 1. ...
"内核编译实验——嵌入式内核编译得起步佳品"是一个专门为初学者设计的实践教程,由浙江大学嵌入式中心提供,旨在帮助学习者掌握嵌入式Linux内核编译的基础知识和技能。以下将详细阐述这个实验所涵盖的主要知识点: ...
条件编译允许程序员根据不同的编译条件选择性地编译代码块。这在开发跨平台或多配置的应用程序时特别有用。 **条件编译指令**: - `#ifdef`:如果指定的宏已被定义,则编译程序段 1;否则编译程序段 2。 - `#...
必须两个压缩分卷part1、...第3篇是C语言高级应用,包括算法、预编译命令、文件和图形,以及预处理命令等内容;第4篇是C语言开发案例,详细讲解了C语言项目开发案例,读者在这里可以学习到C语言项目的整个开发过程。
预处理的结果去除了所有宏替换和条件编译后的代码,便于接下来的步骤。 2. 编译:编译阶段将预处理后的文件转换为汇编代码。这一过程由编译器完成,例如GCC中的`gcc -S`命令会生成`.s`文件。编译器将高级语言的语句...
11. C语言的预处理命令:预处理命令以`#`开头,用于处理源代码中的宏定义、条件编译等。选项C是正确的。每个C程序不一定需要`#include <stdio.h>`,除非需要使用标准输入输出功能;预处理命令可以出现在程序的任何...
- **GCC的执行过程**:GCC编译过程主要包括四个步骤——预处理、编译、汇编和链接。这四个步骤通常由GCC内部自动完成,但也可以通过指定相应的选项来单独控制每个步骤。 ##### 2. 实验步骤 - **步骤1:创建并编辑C...
在编译过程中,预处理阶段会处理宏定义、条件编译等;编译阶段将源代码转化为汇编代码;汇编阶段将汇编代码转化为机器码;链接阶段则将多个目标文件合并成一个可执行文件,同时处理符号引用和重定位。 FreeRTOS的...
预处理结果通常会包括宏定义的展开、条件编译指令的处理以及文件包含等内容。例如,在HELLO项目中,如果源代码中包含了`#define`宏定义,那么预处理后这些宏定义会被相应的值所替代。 #### 2.4 本章小结 预处理是...
这个过程称为预处理、编译和汇编,其中预处理处理宏定义、条件编译等,编译阶段将C代码转换为中间代码,最后汇编阶段将中间代码转换为机器码。 汇编文件通常以.asm为扩展名,它是可读性强的指令集表示,每个指令...
必须两个压缩分卷part1、...第3篇是C语言高级应用,包括算法、预编译命令、文件和图形,以及预处理命令等内容;第4篇是C语言开发案例,详细讲解了C语言项目开发案例,读者在这里可以学习到C语言项目的整个开发过程。
预处理是编译过程的第一步,它负责处理源代码中的宏定义、条件编译指令等。2.1节介绍了预处理的概念和作用,如替换宏、展开头文件等。2.2节具体说明了在Ubuntu下使用`cpp`命令进行预处理的操作。2.3节分析了HELLO...
较全面地讲述了C语言程序设计的基本知识,主要内容包括概述,数据类型、运算符及表达式,基本输入/输出函数,选择结构,循环结构,数组,函数,指针,编译预处理命令,结构与共用,文件和图书管理系统案例介绍等,...
预处理是程序编译的第一步,主要处理源代码中的宏定义、条件编译指令和包含文件等。文章详细阐述了预处理的概念及其在Ubuntu操作系统下的实现,即使用cpp命令进行预处理。通过对hello.c的预处理结果分析,可以理解预...
预处理是编译过程的第一步,它主要负责处理源代码中的预处理器指令,例如宏定义、条件编译等。通过预处理可以简化源代码,使其更加模块化和易于维护。 #### 2.2 在UBUNTU下预处理的命令 在Ubuntu环境下,预处理...
预处理处理宏定义、条件编译等;编译阶段将源代码转换为汇编代码;汇编器将汇编代码转化为机器码;链接器则将各个目标文件整合为可执行文件,同时处理外部符号引用。 7. **优化选项**: GCC提供多种编译优化级别,...
- 预处理是编译前的一步,主要负责宏定义、条件编译、文件包含等任务。 - 通过预处理器cpp,可以修改原始源代码,例如替换宏定义、包含头文件等。 - **在Ubuntu下预处理的命令**: - 使用命令`gcc -E hello.c -o ...
1. **预处理(Pre-Processing)**:GCC会调用预处理器cpp,处理宏定义(如#define)、条件编译指令(#if/#else/#endif)以及包含的头文件(#include)。预处理的结果是一个扩展后的源代码文件,扩展后文件的扩展名通常是.i...