#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
#ifndef 与 #if !defined有区别
基本上一样,不过后者的应用范围更大,可以支持多个预编译变量的检查: #if (!defined(_DEBUG) && defined(USE_MYLIB)) .......... #endif 这种情况用前一种方式就只能写一个嵌套的条件判断: #ifndef _DEBUG #ifdef USE_MYLIB ................ #endif #endif |