首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >#if vs #ifndef vs #ifdef

#if vs #ifndef vs #ifdef
EN

Stack Overflow用户
提问于 2016-05-07 19:38:56
回答 5查看 12.2K关注 0票数 7

首先,我的问题是理解#ifndef#ifdef。我还想了解#if#ifndef#ifdef之间的区别。我知道#if基本上是一个if语句。例如:

代码语言:javascript
复制
#include<iostream>
#define LINUX_GRAPHICS 011x101

int main(){
 long Compare = LINUX_GRAPHICS;
 #if Compare == LINUX_GRAPHICS
   std::cout << "True" << std::endl;
 #endif
}

但其他人,虽然我读到了他们,但我无法理解。它们似乎也是非常相似的术语,但我怀疑它们的作用是否相似。我们将非常感谢您的帮助。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-05-07 19:48:27

宏由在运行时不知道变量值的预处理器展开。它只涉及文本替换(或比较预处理器已知的符号)。你的线路

代码语言:javascript
复制
#if Compare == LINUX_GRAPHICS

将扩展到

代码语言:javascript
复制
#if Compare == 011x101

由于“比较”与"011x101“不同,它的计算结果为false。实际上,我甚至不能百分之百地肯定这一点,但重点是:您将预处理指令与在运行时进行评估的变量混合在一起。这是不理智的。没有预处理指令来替换C++语句。

对于大多数传统的宏用例,现在有更好的方法。如果您真的不需要使用宏,最好不要使用它们。这使得阅读代码变得极其困难。我不明白代码中的宏是如何工作的,除非我真的需要它,否则我不想知道:P),还有其他宏的问题,可能导致程序中很难找到bug。在使用宏之前,我建议您首先考虑是否没有一种更自然的C++方法来实现相同的目标。

PS:

代码语言:javascript
复制
#ifdef SYMBOL
    ifdef = "if defined"
    this part of the code is excluded before the compiler even sees it
    if SYMBOL is not defined (via #define)
#endif

#ifndef SYMBOL
    ifndef = "if not defined"
    this part of the code is excluded before the compiler even sees it
    if SYMBOL is defined (via #define)
#endif

我写“排除”是为了强调它对代码的可读性的坏影响。如果在普通代码块中过度使用#ifdef#ifndef,将非常难以阅读。

票数 6
EN

Stack Overflow用户

发布于 2016-05-07 19:44:57

#if没有任何关于Compare或它包含的值的概念,所以它可能没有做您想做的事情。

请记住,预处理程序会替换纯文本。

该语句将展开,从#if中可以看到

代码语言:javascript
复制
#if Compare == 011x101

并被扩展为

代码语言:javascript
复制
#if 0 == 011x101

这肯定不会在预处理阶段产生true

#ifdef#ifndef指令检查预处理符号是否为#define'd,使用该指令(<-)或编译器预处理器选项(最常见的是-D<preprocessor-symbol>)。

这些并不关心预处理符号是否带有空值或其他东西。一个简单的

代码语言:javascript
复制
#define MY_CONDITION

代码语言:javascript
复制
-DMY_CONDITION

足以满足

代码语言:javascript
复制
#ifdef MY_CONDITION

展开随后出现的文本(或用#ifndef隐藏它)。

Compare声明不是预处理符号,也不能与#ifdef#ifndef一起合理使用。

票数 5
EN

Stack Overflow用户

发布于 2016-05-07 19:52:01

#if是预处理器if。它只能处理预处理程序,它基本上是预处理宏(它们要么类似于函数,要么类似常量)和C标记,只需要一些简单的整数-文字算法。

#ifdef SOMETHING#if defined(SOMETHING)相同,#ifndef SOMETHING#if !defined(SOMETHING)相同。defined是一个特殊的预处理操作符,它允许您测试某物是否是一个已定义的宏。这些基本上是最常见的用途或预处理条件的捷径--测试是否定义了一些宏。

您可以在https://gcc.gnu.org/onlinedocs/的gcc预处理器上找到详细的手册(大约80页)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37092913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档