背景:MFC初学,头文件中有

#if !defined(AFX_HELLOMFC_H__706D36F5_2F1B_40AC_8BE9_0BD6A1D7BBDE__INCLUDED_)
#define AFX_HELLOMFC_H__706D36F5_2F1B_40AC_8BE9_0BD6A1D7BBDE__INCLUDED_

// Info : Other content

#endif // !defined(AFX_HELLOMFC_H__706D36F5_2F1B_40AC_8BE9_0BD6A1D7BBDE__INCLUDED_)

注:AFX_HELLOMFC_H__706D36F5_2F1B_40AC_8BE9_0BD6A1D7BBDE__INCLUDED_ 是一个由VC自定义的标识符,你也可以替换成其他的,上面代码就可以类比为下边的代码,看起来是不是清爽很多啊。这是微软VS的个性化命名

#if !defined(AFX_HELLOMFC_H_)
#define AFX_HELLOMFC_H_

// Info : Other content

#endif // !defined(AFX_HELLOMFC_H_)


正题:C语言的宏定义
一、#if defined 的作用
因为对于一个大程序而言,我们可能要定义很多常量( 不管是放在源文件还是头文件 ),那么我们有时考虑定义某个常量时,我们就必须返回检查原来此常量是否定义,但这样做很麻烦.if defined宏正是为这种情况提供了解决方案.举个例子,如下: 

#define a 100

#define b 100

#define v 100

// ^^^^^^

#define s 100

#define da 100

#define af 100

#define a 200 // Here is the key

上面已经定义过一次 a 的值了,因为中间有很多语句,看不到,又忘了有没有定义,下面又来了一条,把上面的替掉了。这就是问题了!
此时,我们要检查a是否定义(假设我们已经记不着这点了),或者我们要给a一个不同的值,就加入如下句子:

#if defined a // or #ifdef a

#undef a

#define a 200

#endif

或者

#ifndef a

#define a 200

#endif

上面就是 #if defined 的唯一作用了
 
二、#if ! defined 的作用
#if defined XXX_XXX #endif 是条件编译,是根据你是否定义了XXX_XXX这个宏,而使用不同的代码。一般.h文件里最外层的 #if !defined XXX_XXX #define XXX_XXX #endif 是为了防止这个.h头文件被重复include
三、其他相关含义

指令 用途
# 空指令,无任何效果
#include 包含一个源代码文件
#define 定义宏
#undef 取消已定义的宏
#if 如果给定条件为真,则编译下面代码
#ifdef 如果宏已经定义,则编译下面代码
#ifndef 如果宏没有定义,则编译下面代码
#elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#endif 结束一个#if……#else条件编译块
#error 停止编译并显示错误信息

 

转载于:https://www.cnblogs.com/herbertchina/p/4306818.html

#if defined 和 #if ! defined 的用法相关推荐

  1. 解决Spring 异常:defined in BeanDefinition defined in class path resource [XXX], could not be registered.

    背景 因为项目越来越臃肿,需要对项目进行拆包处理. 问题 在拆完包后,发现报了个"defined in BeanDefinition defined in class path resour ...

  2. 条件编译#define、#undef、#if、#elif、#elif defined、#elif !defined 、#endif用法

    条件编译 上代码 // what is the fucking shit.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h"#include &l ...

  3. #if defined和#if !defined的含义

    对于大型项目一般要用到许多宏定义,那么我们有时考虑定义某个常量时,我们就必须返回检查原来此常量是否定义,但这样做很麻烦.if defined宏正是为这种情况提供了解决方案. #define ....  ...

  4. #if defined和#if !defined(c语言的宏定义)

    因为对于一个大程序而言,我们可能要定义很多常量( 不管是放在源文件还是头文件 ),那么我们有时考虑定义某个常量时,我们就必须返回检查原来此常量是否定义,但这样做很麻烦.if defined宏正是为这种 ...

  5. #if defined()的用法

    #if defined()语法 The special operator defined is used in #if and #elif expressions to test whether a ...

  6. php。defined,PHP defined()函数的使用图文详解

    PHP defined()函数的使用图文详解 PHP defined() 函数 例子 定义和用法 defined() 函数检查某常量是否存在. 若常量存在,则返回 true,否则返回 false. 语 ...

  7. 宏定义、define、defined、ifdef、ifndef、undef总结

    define.defined.ifdef.ifndef.undef的用法都属于预处理部分,所谓预处理是指在进行第一遍扫描(语法扫描和语法分析)之前所做的工作.当对一个源文件进行编译时,系统将自动引用预 ...

  8. 当Mac电脑遇到ANDROID_NDK_HOME not defined...报错

    转载自:https://www.cnblogs.com/muxiandong/p/15355065.html 前两天,在Cocos Creator 3.3.0 上想要对原生执行自动绑定C++ JSB的 ...

  9. spring boot2.1.X The bean 'clientDetailsService', defined in XX,could not be registered

    今天在升级spring boot2.1.2的时候出现如下异常 Description:The bean 'clientDetailsService', defined in com.codeus.we ...

最新文章

  1. JVM调优总结(7):调优方法
  2. Want to archive tables? Use Percona Toolkit’s pt-archiver--转载
  3. 安装 |GitBash闪退问题解决方案及Git安装教程( win10系统安装Git后)
  4. java中对map使用entrySet循环
  5. BootStrap笔记-popover的使用(popover中放验证码,点击更新)
  6. Linux进程管理与调度-之-目录导航【转】
  7. 系统服务器地云盘上,系统服务器地云盘上
  8. mysql 集群操作系统_mysql集群部署
  9. Elasticsearch: 配置文件详解
  10. [渝粤教育] 西南科技大学 电力电子技术 在线考试复习资料
  11. 变砖的平板怎样重装android,台电平板电脑刷机教程,小编教你台电平板电脑怎么刷机...
  12. 图片 title 和 alt区别:
  13. Scratch 游戏项目学习法 —— 接苹果(六)让苹果掉到下面
  14. 什么是One Data体系?阿里数据中台解读
  15. Python小工具:批量给视频加水印
  16. NLP 分类问题的讨论
  17. iOS开发 - 商品详情页两种分页模式,只提供思路和实现方式。
  18. 西南科技大学计算机综合大纲,西南科技大学(专业学位)计算机技术研究生考试科目和考研参考书目...
  19. jndi weblogic mysql_WebLogic配置JNDI数据源
  20. 流量思维:拉新、留存、转化、裂变-运营设计(0)

热门文章

  1. ansys matlab 调用,matlab 调用ansys (转载)
  2. idal 创建springboot 项目_手把手的SpringBoot教程,SpringBoot创建web项目(四)
  3. 7-17 爬动的蠕虫 (15 分)
  4. html 表格套表格_HTML表格
  5. Java IdentityHashMap equals()方法与示例
  6. c ++明明的随机数_从列表C ++程序中随机建议电影
  7. c#foreach循环_C#| 使用foreach循环打印整数数组
  8. The security settings could not be applied to the database because the connection has failed安装Mysql
  9. [C++][线程安全]单例模式下双检查锁和线程
  10. 213. 打家劫舍 II golang 动态规划