c++中#if#ifdef的作用

author author     2023-05-05     600

关键词:

用编译器经常会自动生成这些,我自己很少用,想知道经常用的这些的介绍,谢谢了。
谢谢大家的回答
有没有那本书里面有比较详细一点的介绍类似的这些作用,或者给个超链接

一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件
编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。
条件编译命令最常见的形式为:
/////////
#ifdef 标识符
程序段1
#else
程序段2
#endif

它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。
其中#else部分也可以没有,即:
#ifdef
程序段1
#denif
参考技术A 都是条件编译。其原理都是一样的。但是还是有一丁点儿不同。请认真读以下知识,得出不同点。
----------------------------------------------------------------
条件编译是指按照给定的条件决定哪些源代码参与编译,而哪些源代码不参与编译,从而使一个源程序在不同编译条件下生不同的目标程序。C++提供几种不同形式的条件编译指令,可以将一个表达式或者某个宏是否被定义作为编译条件,主要用于设计便于调试的程序或可移值的程序。
条件编译指令有多种,其结构类似于if语句结构。条件编译指令分别以#if、#ifdef或#ifndef指令开始,中间可以有#else指令,最后以#endif指令表示一条编译指令的结束。下面给出条件编译指令常用的三种形式:
#if...[#else]...#endif
#ifdef...[#else]...#endif
#ifndef...[#else]...#endif
#if指令检测其后表达式的值是否为真,如果为真,则随后的源代码要参与编译,直到出#else或#endif;如果不为真,则随后的源代码不参与编译。#ifdef指令是#if
defined指令的缩写,它检测其后的宏是否被定义,如果被定义过,则随后的源代码要参与编译。#ifndef指令也检测其后的宏是否被定义,但不同的是,只有当该宏没有被定义过,随后的源代码参与编译。
----------------------------------------------------------
我得出的结论是:
相同点:1,都是条件编译(废话,是吧?)
2,都是判断宏
不同点:
#if后面可以跟宏,但是也可以直接跟0/1
比如:
#if
0
....
#endif
但是#ifdef就不能直接跟0/1判断。
参考技术B 以#开头的都是预编译指令,就是在正式编译之前,编译器做一些预处理的工作
#if
条件语句
程序段1
//如果条件语句成立,那么就编译程序段1
#endif
程序段2//如果条件不语句成立,那么就编译程序段2
#ifndef
x//先测试x是否被宏定义过
#define
程序段1
//如果x没有被宏定义过,那么就编译程序段1
#endif
程序段2
//如果x已经定义过了则编译程序段2的语句,“忽视”程序段1。
#ifdef
x
//先测试x是否被宏定义过
程序段1
//如果x被宏定义过,那么就编译程序段1
#endif
程序段2
//如果x没有被定义过则编译程序段2的语句,“忽视”程序段1。
参考技术C #if
条件语句
程序段1
//如果条件语句成立,那么就编译程序段1
#endif
程序段2//如果条件不语句成立,那么就编译程序段2
#ifndef
x//先测试x是否被宏定义过
#define
程序段1
//如果x没有被宏定义过,那么就编译程序段1
#endif
程序段2
//如果x已经定义过了则编译程序段2的语句,“忽视”程序段1。
#ifdef
x
//先测试x是否被宏定义过
程序段1
//如果x被宏定义过,那么就编译程序段1
#endif
程序段2
//如果x没有被定义过则编译程序段2的语句,“忽视”程序段1。
if就是判断语句,不是预编译指令。
参考技术D 你好
这两者都是条件编译指令
不同在于:
#if
常量表达式
程序。。。//当常量表达式非零时候才编译本段
#endif
可以这样使用:
#if
常量表达式
程序。。。
//常量表达式非零
#else
程序。。。
//常量表达式为零
#endif
#ifdef
标识符
//标识符经过#define定义过
则编译
程序。。。
#else
程序。。。
#endif
类似的还有#ifndef,避免多重包含

c和c++如何混合编程

...rn"C"之前,我们来看下#ifdef_cplusplus/#endif_cplusplus的作用。很明显#ifdef/#endif、#ifndef/#endif用于条件编译,#ifdef_cplusplus/#endif_cplusplus——表示如果定义了宏_cplusplus,就执行#ifdef/#endif之间的语句,否则就不执行。在这里为什么... 查看详情

externc的作用

#ifdef__cplusplusextern"C"{#endif//一段代码#ifdef__cplusplus}#endifhttps://stackoverflow.com/questions/3789340/combining-c-and-c-how-does-ifdef-cplusplus-workexternC告诉编译器,这段代码用C的方式编译和链接,C++可以调用这段代码c中没有函数重 查看详情

C++头文件中#ifdef __linux和#ifdef __unix的区别

】C++头文件中#ifdef__linux和#ifdef__unix的区别【英文标题】:Differencebetween#ifdef__linuxand#ifdef__unixinC++headerfile【发布时间】:2015-10-0304:09:17【问题描述】:我见过一些用于处理不同操作系统的样板头文件代码,如下所示:#ifdef__WIN32//wi... 查看详情

在 DLL 中导出的 C++ 函数中使用 #ifdef 块

】在DLL中导出的C++函数中使用#ifdef块【英文标题】:using#ifdefblockinsideexportedC++functioninDLL【发布时间】:2014-10-0123:24:51【问题描述】:我正在尝试在导出到DLL的函数中使用#ifdef开关我遇到的问题是我的.EXE项目无法更改ifdef定义。... 查看详情

#ifdef__cplusplus的使用

#ifdef__cplusplusextern"C"#endif//C样式的代码声明 #ifdef__cplusplus#endif这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cp... 查看详情

如何在#ifdef 中编写if 条件。用于分期。在客观-c

】如何在#ifdef中编写if条件。用于分期。在客观-c【英文标题】:Howtowriteifconditionin#ifdef.forStaging.inobjective-c【发布时间】:2011-08-2613:10:42【问题描述】:我需要在这个调用中再添加一个条件Staging..如何在这种情况下做到这一点。#i... 查看详情

#ifdef 标志来区分 gcc 和 g++ 编译器? [复制]

】#ifdef标志来区分gcc和g++编译器?[复制]【英文标题】:#ifdefflagtotelldifferencebetweengccandg++compilers?[duplicate]【发布时间】:2014-09-1818:27:04【问题描述】:gcc将C程序编译为C,将C++程序编译为C++,因此需要在C++中声明“extern"C"”。而g+... 查看详情

extern"c"

...extern"C"{#endif#include"XXX.h"#ifdef_cplusplus}#endif解释:extern"C"的作用是,告诉C++编译器,下面的代码按照C的方式进行编译,说白了,不要对这些函数进行名字重整(functionnamemangling)。通常在C++程序中使用C函数或者模块时,需要用到... 查看详情

#ifdef #ifndef 在 Java 中

】#ifdef#ifndef在Java中【英文标题】:#ifdef#ifndefinJava【发布时间】:2010-12-2107:04:18【问题描述】:我怀疑是否有办法在Java中生成编译时条件,例如C++中的#ifdef#ifndef。我的问题是有一个用Java编写的算法,我对该算法有不同的运行时... 查看详情

“#ifdef__cplusplusextern"c"{#endif”的定义

...?一开始看到这个也很茫然。上网查找了一些资料。主要作用:为了在C++代码中调用用C写成的库文件,就需要用extern"C"来告诉编译器:这是一个用C写成的库文 查看详情

#if vs #ifndef vs #ifdef

】#ifvs#ifndefvs#ifdef【英文标题】:【发布时间】:2016-05-0719:38:56【问题描述】:我的问题首先是理解#ifndef和#ifdef。我还想了解#if、#ifndef和#ifdef之间的区别。我知道#if基本上是一个if语句。例如:#include<iostream>#defineLINUX_GRAPHICS... 查看详情

#ifdef 在同一个头文件中返回不同的值

】#ifdef在同一个头文件中返回不同的值【英文标题】:#ifdefisreturningdifferentvaluesinsidethesameheaderfile【发布时间】:2020-11-1403:59:56【问题描述】:我有两个C++文件main.cpp和client.cpp,还有一个头文件action.h。我正在尝试使用预处理器指... 查看详情

有 C++ 标准库 ifdef 或 ifndef 预处理器指令吗?

】有C++标准库ifdef或ifndef预处理器指令吗?【英文标题】:HaveC++standardlibraryifdeforifndefpreprocessorinstructions?【发布时间】:2019-01-2012:39:18【问题描述】:我正在用C++构建自己的终端应用程序项目,并且我在问自己标准库是否有ifdef... 查看详情

在 Windows 和 Linux 上编译 C++:ifdef 开关 [重复]

】在Windows和Linux上编译C++:ifdef开关[重复]【英文标题】:C++compilingonWindowsandLinux:ifdefswitch[duplicate]【发布时间】:2011-10-0218:11:21【问题描述】:我想在Linux和Windows上运行一些c++代码。我只想为一个操作系统而不是另一个操作系统... 查看详情

这些 C++ 代码片段有啥作用?

】这些C++代码片段有啥作用?【英文标题】:WhatdotheseC++codesnippetsdo?这些C++代码片段有什么作用?【发布时间】:2009-08-3000:43:51【问题描述】:#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif为什么要定义这些标... 查看详情

if/else 语句不起作用 C++ [关闭]

】if/else语句不起作用C++[关闭]【英文标题】:if/elsestatementdoesn\'tworkc++[closed]【发布时间】:2016-03-0706:30:39【问题描述】:我是编程新手,这是我的代码。#include<iostream>usingnamespacestd;intmain(intargc,char**argv)charname[50];cout<<"Plea... 查看详情

#if和#ifdef条件编译注意(代码片段)

...很少用到这两个条件编译,只是在头文件的开头使用过#ifdef....<CODE>.... #endif,他是防止头文件被重复包含,导致的变量被多处声明或定义。最近写程序发现#if......#endif 也是特别好用的。 #if他的后面是接一个表达... 查看详情

c++ #ifdef Mac OS X 问题

】c++#ifdefMacOSX问题【英文标题】:c++#ifdefMacOSXquestion【发布时间】:2011-10-1118:53:33【问题描述】:我对C++还很陌生。我目前正在做一个小组项目,我们想让我们的课程与实验室计算机(Windows)和我的计算机(MacOSX)兼容。这是我们一... 查看详情