ifdef endif ifndef 定义+代码详解

ifdef endif ifndef 定义+代码详解ifdef endif 代码的具体用法及示例 条件编译 预处理指令

1. 这些代码是什么?属于C/C++中什么类型的词?

#ifdef  #endif  #ifndef 属于C/C++预处理指令,常见的预处理指令还包括#include #define #undef #elif #error等。

预处理指令定义预处理指令是以 #号开头 的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是 指令关键字 ,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在 编译器进行编译之前 对源代码做某些转换。

2. 这些代码出现的意义是什么?

一般情况下,源程序中所有的行都参加编译。C/C++中有个概念叫做条件编译 ”。“条件编译”要求做到对 指定部分 内容编译。当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。而这些预处理指令,可以帮助我们达到这个效果。

3.代码的具体用法及示例(分为实现文件 + 头文件)

实现文件中:

1  —  标识符被定义(出现#define *):

#include 
  
    using namespace std; #define NYJ int main() { #ifdef NYJ cout << "ifdef NYJ" << endl; #else cout << "else" << endl; #endif } 
  

运行结果:

ifdef endif ifndef 定义+代码详解

 此时因为标识符“NYJ”被定义了,因此编译器会对#ifdef 后面的内容进行编译,与此同时跳过对#else后面内容的编译。

2  —  标识符没有被定义(不存在#define *)

运行结果:

ifdef endif ifndef 定义+代码详解

 此时标识符“NYJ”未被定义,因此编译器不会对#ifdef后面的内容进行编译,与此同时对#else #endif 后面内容进行编译。

注释:在以上代码中,#else并非必须出现。

ifndef的用法

此外,还有 #ifndef 的用法,顾名思义,ifdef = if define ,而 ifndef = if not define ,与ifdef意思恰好相反,以下是关于它的代码示例:

#include 
  
    using namespace std; int main() { #ifndef NYJ cout << "ifndef NYJ" << endl; #else cout << "else" << endl; #endif } 
  

 标识符没有被定义(不存在#define *)

ifdef endif ifndef 定义+代码详解

标识符被定义(出现#define *)

ifdef endif ifndef 定义+代码详解

头文件中:

在头文件中使用 #ifdef 和#ifndef,可以防止双重定义的错误。

例如在头文件 “NYJ.h”中,定义了如下类

class D { int a; int b; };

ifdef endif ifndef 定义+代码详解

 双重定义:在 “K.h” 中,由于包含了 NYJ.h ,因此包含了 Class D ,同理,K.h中包含了a.h,而a.h中又包含了NYJ.h,因此Class D被双重定义了,而类是不允许被双重定义的,因此,为防止这种现象发生,我们可以采取如下措施:

 #ifndef NYJ_H //if !define NYJ_H 也可以这样写 #define NYJ_H class D { int a; int b; }; #endif

这样一来,第一次调用这个头文件的时候,没有定义NYJ_H,就会继续对下面的语段进行声明。但是当第二次调用头文件时,已经定义了NYJ_H,所以就不会进行下面的代码声明了。这就是条件编译防止头文件包含的原理。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209554.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午8:59
下一篇 2026年3月19日 上午8:59


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号