#if,#ifdef和#if defined

来源:互联网 发布:毛姆 知乎 编辑:程序博客网 时间:2024/06/09 16:09
以#开头的都是预编译指令,就是在正式编译之前,编译器做一些预处理的工作
#if 条件语句程序段1  //如果条件语句成立,那么就编译程序段1  
#endif程序段2//如果条件不语句成立,那么就编译程序段2 
#ifndef x//先测试x是否被宏定义过  
#define   程序段1 //如果x没有被宏定义过,那么就编译程序段1   
#endif  程序段2 //如果x已经定义过了则编译程序段2的语句,“忽视”程序段1。 
条件编译 预处理程序提供了条件编译的功能。 可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。 这对于程序的移植和调试是很有用的。 条件编译有三种形式,下面分别介绍: 1. 第一种形式: #ifdef 标识符 程序段1 #else 程序段2 #endif 它的功能是,如果标识符已被 #define命令定义过则对程序段1进行编译;否则对程序段2进行编译。如果没有程序段2(它为空) 2. 第二种形式: #ifndef 标识符 程序段1 #else 程序段2 #endif 与第一种形式的区别是将“ifdef”改为“ifndef”。它的功能是,如果标识符未被#define命令定义过则对程序段1进行编译, 否则对程序段2进行编译。这与第一种形式的功能正相反。 3. 第三种形式: #if 常量表达式 程序段1 #else 程序段2 #endif 它的功能是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能
#ifdef x  //先测试x是否被宏定义过  程序段1   //如果x被宏定义过,那么就编译程序段1  
#endif 程序段2 //如果x没有被定义过则编译程序段2的语句,“忽视”程序段1。 
#error message #error命令可以简单的使编译器在发生错误时停止. 当遇到一个#error时,编译器会自动输出行号而无论message的内容. 本命令大多是用于调试.
 
#if和#ifdef使用问题 

#define TARGET_LITTLE_ENDINA 1
#define TARGET_BIG_ENDINA   0
#ifdef TARGET_LITTLE_ENDINA
call little endina 
#else
call big endina 
#endif
上面的今天写的代码,发现我不管把TARGET_LITTLE_ENDINA和TARGET_BIG_ENDINA定义成0或者1,调用的都是little endina函数,一直找不到问题所在,看看代码也没有什么问题。经过分析和查找相关的文档,原来是自己没有理解#if和#ifdef之间的区别。
对于#if需要是一个表达式,如果表达式为1则调用#if下面的代码。
对于#ifdef需要的只是这个值有没有定义,并不关心这个值是什么。
表明之间的区别问题就变得非常的容易,只要把上述代码中的#ifdef改成#if就可以达到目的。
从这个问题发现自己在一些基本的C或C++的语法上面还是有很大的不足,到网上查找一些书籍,对这方面介绍的也不是特别多,相比而言,MSDN还是比较全面。平时比较痛恨MS的,不过平心而论,MS对于开发软件工具和文档做的还是相当不错,尤其是开发文档方面非常全面,自己在项目SDK的开发过程中也需要加强这方面的工作。
 
#if,#ifdef和#if defined 

对于条件编译#if,#ifdef和#if defined这些,深究起来还是有些意思

#if要求是一个表达式,为真则执行以下代码,

#ifdef则只要求是否定义,并不关心这个值是什么。

#if defined则是#if和#define的连用。

比如:

#if 0
/* some code here*/
/* commented */
#endif

#ifdef __MMI_MESSAGES_CLUB__
#i nclude "MessagesResDef.h"
#endif

#if defined( __MMI_IRDA_SUPPORT__ )
#i nclude "ConnectivityResDef.h "
#endif

#if defined还可以串连多个条件:

#if defined( __MMI_MYAPP1_SUPPORT__ ) || defined( __MMI_MYAPP2_SUPPORT__ )
#i nclude "ConnectivityResDef.h "
#endif

#ifndef _HEAD_H
#define _HEAD_H
//预处理防止头文件重复包含,亦可用#pragma once
.
.
.
#endif
0 0
原创粉丝点击