#ifdef 条件编译,其实如此简单

今天看一个问题

怎么消灭头文件被多次include导致的错误?

解决就是要用到条件编译,关于怎么解决“头文件被多次include导致的符号重定义错误”参考blog

http://bbs.csdn.net/topics/350119699

以下只介绍条件编译,内容如下:

这几个宏是为了进行条件编译。一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。

它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。其中#else部分也可以没有。

使用方法:

在#ifdef之前如果出现#idefine 标识符(对应的标识符),那么久运行程序段1,否则运行程序段2.如下我自己写的简单的例子

编译上图code,只会编译#else到#endif的部分,及运行结果是只输出:runing else part.

上图中第六行加入 #define debug  ,则遇到条件编译时,只会编译#ifdef到#else中间的部分。运行结果为:runing main part

条件编译的好处,优点:

有人会问:不用条件编译命令而直接用if语句也能达到要求,用条件编译命令有什么好处呢?的确,此问题完全可以不用条件编译处理,但那样做目标程序长(因为所有语句都编译),而采用条件编译,可以减少被编译的语句,从而减少目标的长度。当条件编译段比较多时,目标程序长度可以大大减少。



时间: 2024-12-26 13:07:55

#ifdef 条件编译,其实如此简单的相关文章

条件编译中的基本语法

今天对条件编译进行了简单回顾. 整理基本语法 以备后来参考. 1.#if#if的一般形式是: #if 表达式  程序段1#else  程序段2# endif # if的执行过程是:如果表达式为真,编译程序段1,否则编译程序段2.作为一种特例,当条件为假不执行任何操作时,可以省略#else.2.#if-#elif-#else-#endif#if-#elif的形式与if-else if语句形式基本相同,格式为: #if 表达式1  程序段1# elif 表达式m  程序段m# else  程序段n#

<29>【掌握】#if-#else 条件编译指令+

[掌握]#if-#else 条件编译指令 #include <stdio.h> #define score 99 int main(int argc, const char * argv[]) { //传统方式 // int score = 76; // //判断成绩属于哪个等级 // if(score<60){ // printf("E\n"); // }else if (score<=69){ // printf("D\n"); // }

C语言--&gt;(十四)结构体、宏、编译

知识点: 1.结构体 struct 2.typedef关键字 3.宏的定义 4.宏与函数的区别 5.文件包含和多文件编译 6.条件编译 ===========================结构体 思考:如果现在希望保存一个学生的信息,姓名,身高,年龄,地址,该如何保存 char name[64]; float height; int age; char addr[64]; 1.什么是结构体 struct 结构体指的是一种数据结构,是c语言中复合数据类型的一 种多种不同数据类型的集合 2.结构体

linux 互斥锁

在多线程控制中,可以通过互斥锁,实现多个线程对共享资源的单独访问.在同一时刻,只有一个线程能够掌握互斥锁,只有这个线程能够对共享资源进行访问,其他线程被阻塞,直到互斥锁被释放. 如果,互斥锁上锁期间,有多个线程阻塞,那么所有被阻塞的线程会被设置为可执行状态.第一个执行的线程,取得互斥锁的控制权,上锁.其他线程继续阻塞. 一  创建互斥锁 互斥锁可以被静态创建或动态创建.   静态创建: pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;  特别说

C语言基础(转载自大海笔记)

# C语言基础2015年03月26日10:04:411.    语言排行榜C——java——objective-C2.    进制:进制:进位机制.用普通的话讲,应该为人为的定义一种度量来标识一样东西.计算机常用的进制有:十进制.二进制.八进制和十六进制.?    十进制:0-9(十个指头)(进制表示基数:10)?    二进制:0,1(基数为2)?    八进制:0-7(基数为8)?    十六进制:0-9,A-F(基数为16)    可以有很多进制,比如分钟为60进制等等.3.    位权为

IHostingEnvironment VS IHostEnvironment - .NET Core 3.0中的废弃类型

原文:IHostingEnvironment VS IHostEnvironment - .NET Core 3.0中的废弃类型 原文: https://andrewlock.net/ihostingenvironment-vs-ihost-environment-obsolete-types-in-net-core-3/ 作者: Andrew Lock 译者: Lamond Lu 本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard

C语言预处理

1.由源码到可执行程序的过程(1)源码.c->(编译)->elf可执行程序(2)源码.c->(编译)->目标文件.o->(链接)->elf可执行程序(3)源码.c->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序(4)源码.c->(预处理)->预处理过的.i源文件->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序

C代码编译成可执行程序的过程

C代码通过编译器编译成可执行代码,经历了四个阶段,依次为:预处理.编译.汇编.链接. 接下来详细讲解各个阶段 一.预处理 1.任务:进行宏定义展开.头文件展开.条件编译,不检查语法. 2.命令:gcc -E [源文件]  -o [预处理文件] 3.案例:用gcc编译器预处理demo1.c代码,预处理后的文本放到demo1.i中.(gcc -E demo1.c -o demo1.i) demo1.c代码如下: 1 #include <stdio.h> 2 3 #define add(a, b)

C#强大的编程功能

下面列出一些C#重要的功能 1.布尔条件 2.自动垃圾回收 3.标准库 4.组件版本 5.属性和事件 6.委托和事件管理 7.易于使用的泛型 8.索引器 9.条件编译 10.简单的多线程 11.LINQ和Lambda表达式 12.集成Windows