C语言-条件编译使用分析
1、基本概念
条件编译的行为类似于C语言中的if…else…
条件编译是预编译指示命令,用于控制是否编译某段代码
2、实例分析
条件编译初探 22-1.c
#include <stdio.h>
#define C 1
int main()
{
const char* s;
#if( C == 1 )
s = "This is first printf...\n";
#else
s = "This is second printf...\n";
#endif
printf("%s", s);
return ;
}
3、条件编译的本质
预编译器根据条件编译指令有选择的删除代码
编译器不知道代码分支的存在
if. .. else ... 语句在运行期进行分支判断
条件编译指令在预编译期进行分支判断
可以通过命令行定义宏
- gcc -Dmacro=value file.c 或 gcc -Dmacro file.c
4、#include的本质
#include的本质是将已经存在的文件内容嵌入到当前文件中
#include的间接包含同样会产生嵌入文件内容的操作
如何解决间接包含同—个头文件产生编译错误?
解决方案:
#ifndef _HEADER_FILE H
#define _HEADER_FILE H
// source code
#endif
5、实例分析
条件编译的使用
global.h
// global.h
#ifndef _GLOBAL_H_
#define _GLOBAL_H_
int global = ;
#endif
test.h
// test.h
#ifndef _TEST_H_
#define _TEST_H_
#include "global.h"
const char* NAME = "test.h";
char* hello_world()
{
return "Hello world!\n";
}
#endif
22-3.cpp
//#include <stdio.h>
#include "test.h"
#include "global.h"
int main()
{
const char* s = hello_world();
int g = global;
// printf("%s\n", NAME);
// printf("%d\n", g);
return ;
}
条件编译可以解决头文件重复包含的编译错误
7、条件编译的意义
条件编译使得我们可以按不同的条件编译不同的代码段,因而可以产生不同的目标代码
#if…#else…#endif被预编译器处理,而if…else .. 语句被编译器处理,必然被编译进目标代码
实际工程中条件编译主要用于以下两种情况:
-不同的产品线共用一份代码
-区分编译产品的调试版和发布版
8、实例分析
产品线区分及调试代码应用 product.h 22-4.c
product.h
#define DEBUG 1 //调试版
#define HIGH 1 //高端产品
22-4.c
#include <stdio.h>
#include "product.h"
#if DEBUG
#define LOG(s) printf("[%s:%d] %s\n", __FILE__, __LINE__, s)
#else
#define LOG(s) NULL
#endif
#if HIGH
void f()
{
printf("This is the high level product!\n");
}
#else
void f()
{
}
#endif
int main()
{
LOG("Enter main() ...");
f();
printf("1. Query Information.\n");
printf("2. Record Information.\n");
printf("3. Delete Information.\n");
#if HIGH
printf("4. High Level Query.\n");
printf("5. Mannul Service.\n");
printf("6. Exit.\n");
#else
printf("4. Exit.\n");
#endif
LOG("Exit main() ...");
return ;
}
9、小结
通过编译器命令行能够定义预处理器使用的宏
条件编译可以避免围复包含头同—个头文件
条件编译是在工程开发中可以区别不同产品线的代码
条件编译可以定义产品的发布版和调试版
C语言-条件编译使用分析的更多相关文章
- (五)c语言条件编译#ifdef与#if defined
c语言条件编译#ifdef与#if defined defined NAME是用来判断NAME是否被定义了(被用define定义了). #ifdef NAME == #if defined(NAME) ...
- 利用R语言打造量化分析平台
利用R语言打造量化分析平台 具体利用quantmod包实现对股票的量化分析 1.#1.API读取在线行情2.#加载quantmod包3.if(!require(quantmod)){4. instal ...
- R语言重要数据集分析研究——需要整理分析阐明理念
1.R语言重要数据集分析研究需要整理分析阐明理念? 上一节讲了R语言作图,本节来讲讲当你拿到一个数据集的时候如何下手分析,数据分析的第一步,探索性数据分析. 统计量,即统计学里面关注的数据集的几个指标 ...
- c语言条件编译#ifdef与#if defined
c语言条件编译#ifdef与#if defined c语言条件编译#ifdef与#if defined 摘自:https://www.cnblogs.com/zhangshenghui/p/566 ...
- Go语言的前景分析
本文为原创文章,转载注明出处,asdfasdfasdf 欢迎扫码关注公众号flysnow_org或者网站http://www.flysnow.org/,第一时间看后续精彩文章.觉得好的话,顺手分享到朋 ...
- Go将统治下一个10年?Go语言发展现状分析
“本文是国内Go语言大中华区首席布道师——许式伟,在QCon2015上海站上的分享.他预测Go语言10年内一定会超过C和java,并且统治这一个10年. Go语言语法及标准库变化 Go从1.0版本到现 ...
- 猴子吃桃问题之《C语言经典案例分析》
猴子吃桃问题之<C语言经典案例分析>一.[什么是猴子吃桃] 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个.第二天早上又将第一天剩下的桃子吃掉一半 ...
- Go语言源码分析之unsafe
Go语言源码分析之unsafe 1.什么是unsafe unsafe 库让 golang 可以像C语言一样操作计算机内存,但这并不是golang推荐使用的,能不用尽量不用,就像它的名字所表达的一样,它 ...
- Go语言的堆栈分析
本文为理解翻译,原文地址:http://www.goinggo.net/2015/01/stack-traces-in-go.html Introduction 在Go语言中有一些调试技巧能帮助我们快 ...
随机推荐
- linux--工具进阶
linux学习 看完了基础篇,下面来看进阶篇 我好想哭看这的时候,好多只是听说过,但完全没有试过,感觉自己懂得有点少,就是缺乏一些知识储备,也就是必须知道了某些或学过了某些知识才适合来看这一部分,看得 ...
- Luogu2040 | 打开所有的灯 (广搜+状压)
题目背景 pmshz在玩一个益(ruo)智(zhi)的小游戏,目的是打开九盏灯所有的灯,这样的游戏难倒了pmshz... 题目描述 这个灯很奇(fan)怪(ren),点一下就会将这个灯和其周围四盏灯的 ...
- ng-模板语法
插值 文本绑定 <p>Message: {{ msg }}</p> <p [innerHTML]="msg"></p> 属性绑定 & ...
- cf1282c
题意描述: 给你一颗带权无根树,共有2*n个节点,有n对人,然后每一个人被分配到一个节点上 问题1:怎么安排使得这n对人之间距离之和最小 问题2:怎么安排使得这n对人之间距离之和最大 题解:直接去想具 ...
- 欢迎来到ZhuSenlin的博客
置顶说明: 本博客的目的:为了巩固自己所学知识,努力提高自己的专业技能:若文章能够帮助到你,是我莫大的荣幸. 本博客的文章主要涉及的领域为游戏开发(本人不才,也在努力学习中) 随笔主要记录一些琐碎的知 ...
- sqli-labs less-9 --> less-10
时间盲注: 利用时间函数,观察不同条件的等待时长:利用sleep(),benchmark()等函数,让MySQL的执行时间变长 时间盲注多于if这样的函数结合(if(expr1,expr2,expr3 ...
- 实现Windows数据更新
一.枚举 枚举是一组描述性的名称 定义一组有限的值,不能包含方法 对可能的值进行约束 .定义枚举类 public enum Gender { Male,Female } .使用枚举表示整数值 publ ...
- jQuery---美女相册案例
美女相册案例 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...
- centOS添加ipv6支持(仅限已分配ipv6地址和网关)
https://blog.csdn.net/cnmilan/article/details/8493977 CentOS 环境下 IPv6设置方法: 1)/etc/sysconfig/network ...
- Alan Walker MV 合辑01 by defender
Alan Walker MV合辑 出来啦! 百度网盘下载地址: 链接:https://pan.baidu.com/s/10WSool70XBe_8tJOae8V-w 提取码:uckq 地址查看 Mi ...