史上最全条件编译解析 #ifdef #ifndef #undef #else #endif
C语言和C++语言程序中广泛存在着#ifdef或#ifndef等条件编译语句,本篇就系统介绍下他们的用法。 这几个宏是为了进行条件编译。一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。
#ifdef
|
1
2
3
4
5
|
#ifdef 标识符 // 程序段1#else // 程序段2#endif |
|
1
2
3
|
#ifdef 标识符 // 程序段1#endif |
例1 不同计算机系统的条件编译
这里的“程序段”可以是语句组,也可以是命令行。这种条件编译可以提高C源程序的通用性。如果一个C源程序在不同计算机系统上运行,而不同的计算机又有一定的差异。例如,我们有一个数据类型,在Windows平台中,应该使用long类型表示,而在其他平台应该使用float表示,这样往往需要对源程序作必要的修改,这就降低了程序的通用性。可以用以下的条件编译:
|
1
2
3
4
5
|
#ifdef WINDOWS# define MYTYPE long#else# define MYTYPE float#endif |
|
1
|
#define WINDOWS |
|
1
|
#define MYTYPE long |
|
1
|
#define WINDOWS 0 |
例2 调试程序的条件编译
|
1
2
3
|
#ifdef DEBUGprint ("device_open(%p)\n", file);#endif |
|
1
|
#define DEBUG |
|
1
2
3
4
5
6
7
8
9
|
#include <iostream>using namespace std;int main( int argc, char * argv[] ){#ifdef DEBUG cout << "Beginning execution of main()" << endl;#endif return 0;} |
|
1
|
Press any key to continue |
|
1
2
3
4
5
6
7
8
9
10
|
#include <iostream>using namespace std;#define DEBUGint main( int argc, char * argv[] ){#ifdef DEBUG cout << "Beginning execution of main()" << endl;#endif return 0;} |
|
1
2
|
Beginning execution of main()Press any key to continue |
|
1
2
3
|
#define DEBUG#ifdef DEBUG#endif |
|
1
2
3
4
5
6
7
8
9
|
#include <iostream>#include "head.h"int main( int argc, char * argv[] ){#ifdef DEBUG cout<< "Beginning execution of main()" << endl;#endif return 0;} |
|
1
2
|
Beginning execution of main()Press any key to continue |
|
结论: |
#ifndef
|
1
2
3
4
5
|
#ifndef 标识符 // 程序段1#else // 程序段2#endif |
#undef
|
1
2
3
4
5
6
7
8
9
10
11
|
#include <iostream.h>#include<string.h>#define MAX 5#undef MAXvoid main(){char name[MAX]="abcde"; //只能用abcd,否则会提示说超出长度,原因大概是"\0"字符cout<<"MAX = "<<MAX<<endl;for(int i=0;i<MAX;i++)cout<<name<<" "<<endl;} |
|
1
2
3
4
5
|
#define TEST_A 1#define TEST_CLASS_A clase T1#include "TEST.h"#undef TEST_A#undef TEST_CLASS_A |
|
1
2
|
#undef TEST_A 1#undef TEST_CLASS_A clase T1 |
|
1
|
#define TEST_A 1 |
|
1
2
3
4
5
6
7
8
9
10
|
#include <stdio.h>int main( void ){#define MAX 200 printf("MAX= %d\n",MAX);#undef MAX#define MAX 300 printf("MAX= %d\n",MAX); return 0;} |
#if
|
1
2
3
4
5
|
#if 表达式 // 程序段1#else // 程序段2#endif |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#define LETTER 1int main( int argc, char * argv[] ){ char str[20] = "C Language"; char c; int i=0; while( (c=str[i])!='\0' ) { i++;#if LETTER if(c>='a'&&c<='z') c=c-32;#else if(c>='A'&&c<='Z') c=c+32;#endif printf("%c",c); } return 0;} |
|
1
|
C LANGUAGE |
|
1
|
#define LETTER 0 |
|
1
|
c language |
史上最全条件编译解析 #ifdef #ifndef #undef #else #endif的更多相关文章
- Feign Ribbon Hystrix 三者关系 | 史上最全, 深度解析
史上最全: Feign Ribbon Hystrix 三者关系 | 深度解析 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -25[ 博客园 总入口 ] 前言 疯狂创客圈(笔者尼恩创建的 ...
- Springcloud 配置 | 史上最全,一文全懂
Springcloud 高并发 配置 (一文全懂) 疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列之15 [博客园总入口 ] 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)Spring ...
- SpringCloud gateway (史上最全)
疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -25[ 博客园 总入口 ] 前言 ### 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家 ...
- JMeter 使用 http长连接 |史上最全
疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家介绍三个版本的 高并发秒杀: ...
- 史上最全的各种C++ STL容器全解析
史上最全的C++ STL 容器大礼包 为什么\(C++\)比\(C\)更受人欢迎呢?除了\(C++\) 的编译令人感到更舒适,\(C++\)的标准模板库(\(STL\))也占了很重要的原因.当你还在用 ...
- 开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发
[原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文 http: ...
- 史上最全的CSS hack方式一览
做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我们会极不情愿的使用这个不太友好的方式来达到大家要求的页面表现.我个人是不太推荐使用hack的,要知道 ...
- [转]史上最全的CSS hack方式一览
做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我们会极不情愿的使用这个不太友好的方式来达到大家要求的页面表现.我个人是不太推荐使用hack的,要知道 ...
- 史上最全的maven pom.xml文件教程详解
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
随机推荐
- sqlserver备份的几种方式
1.用sqlserver的维护计划 在这里我就不给截图演示了,这个比较简单,无非就是通过sqlserver自己的维护计划拖拽出2个一个‘备份数据库’任务和一个‘清除维护’任务. 需要注意的点: 1)有 ...
- white-space的值
white-space的值:normal 默认.空白会被浏览器忽略.pre 空白会被浏览器保留.其行为方式类似 HTML 中的 标签.nowrap 文本不会换行,文本会在在同一行上继续,直到遇到 标签 ...
- ZooKeeper 主要的操作演示样品
// 创建一个与server的连接 ZooKeeper zk = new ZooKeeper("localhost:" + CLIENT_PORT, ClientBase.CONN ...
- 学习Easyui
学习Easyui 社区easyui 论坛:http://bbs.jeasyuicn.com API地址:http://www.jeasyuicn.com/api 简单桌面版:http://app.bt ...
- 面向对象JS基础讲解,工厂模式、构造函数模式、原型模式、混合模式、动态原型模式
什么是面向对象?面向对象是一种思想!(废话). 面向对象可以把程序中的关键模块都视为对象,而模块拥有属性及方法.这样我们如果把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作.接下 ...
- [译]Java 垃圾回收介绍
说明:这篇文章来翻译来自于Javapapers 的Java Garbage Collection Introduction 在Java中,对象内存空间的分配与回收是由JVM中的垃圾回收进程自动完成的. ...
- 在OpenWrt上编写自己的硬件操作程序
上一篇文章中有写到如何使用OPENWRT的SDK,这里继续,写怎么在上面开发自己的应用程序. 我欲在OpenWrt上编写一个软件,它能够去读取某个AD芯片的多通道采样值. 在看这篇文章之前请看这官方的 ...
- 在Ubuntu 12.04 - 64bit中安装CodeSourcery时提示错误
安装时提示错误,Your 64-bit Linux host is missing the 32-bit libraries requied to install and use Sourcery C ...
- HTML 速成
html零基础者入. 记得学计算机网络的时候好像有学过一些HTML,但没运用起来都忘光了.近来想学学如何写网页.就从html(HyperText Markup Language超文本标记语言)入手了. ...
- 【转】Android 网络通信框架Volley简介(Google IO 2013)
Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v= ...