#if 对比#ifndef 对比#ifdef

#if vs #ifndef vs #ifdef

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

#include<iostream>
#define LINUX_GRAPHICS 011x101

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

但是其他的,虽然我读过他们,但我无法理解。它们看起来也非常相似,但我怀疑它们的作用是否相似。将不胜感激。

#ifCompare 或其包含的值没有任何概念,因此它可能不会按照您的意图进行。

记住预处理器会进行纯文本替换。

声明将从 #if 展开为

#if Compare == 011x101

并扩展为

#if 0 == 011x101

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


#ifdef#ifndef 指令检查预处理器符号是否完全 #define,使用该 (<--) 预处理器指令,或您的编译器预处理器选项(最常见的是 -D<preprocessor-symbol>)。
这些不关心预处理器符号是否带有空值或其他东西。一个简单的

#define MY_CONDITION

-DMY_CONDITION

足以满足

#ifdef MY_CONDITION

扩展后面的文本(或使用 #ifndef 隐藏它)。


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

宏由预处理器扩展,预处理器在运行时对变量值一无所知。它只是关于文本替换(或比较预处理器已知的符号)。你的线路

#if Compare == LINUX_GRAPHICS

将扩展到

#if Compare == 011x101

并且由于 "Compare" 与“011x101”不同,它的计算结果为 false。实际上,我什至不能 100% 确定这一点,但重点是:您将预处理器指令与在运行时评估的变量混合在一起。那是胡说八道。预处理器指令不是用来替换 C++ 语句的。

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

PS:

#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

我写 "excluded" 是为了强调它对代码可读性的不良影响。如果您在普通代码块中过度使用 #ifdef#ifndef,将非常难以阅读。

基本上,预处理器会进行文本替换。然后编译器将程序编译成机器码。然后 CPU 执行机器指令。这意味着您不能使用预处理器 #if 而不是运算符 if:一个执行文本替换,而第二个为 CPU.

生成分支代码

因此 #if#ifdef#ifndef 等预处理器指令用于 "semi-automatic mode" 基于某些 "meta-input" 生成(一些)不同的程序.实际上,您始终可以自己进行这些替换,并在没有任何预处理器指令的情况下运行 C/C++ 程序。此外,编译器通常有一个命令行开关,它只输出预处理程序,即没有任何 #if 指令。尝试使用它,您应该了解这些指令的作用。

#ifdef XXX#if defined(XXX) 相同,其中 defined(XXX) 是内置预处理器专用函数,当标识符 XXX 由另一个预处理器指令在程序文本中定义时为真 #define. #ifndef XXX 只是 #if !defined(XXX).

#if 是预处理器 if。它只能处理预处理器的东西,基本上是预处理器宏(类似于函数或常量)和具有一些简单的整数文字算术的 C 标记。

#ifdef SOMETHING#if defined(SOMETHING) 相同,并且 #ifndef SOMETHING#if !defined(SOMETHING) 相同。 defined 是一个特殊的预处理器运算符,它允许您测试 SOMETHING 是否是已定义的宏。这些基本上是最常见用途或预处理器条件的快捷方式——测试是否定义了某些宏。

您可以在以下网址找到有关 gcc 预处理器的详细手册(约 80 页) https://gcc.gnu.org/onlinedocs/ .

预处理器#ifdef 和#ifndef 的意思如下:在您的示例中,您使用#define 将名为LINUX_GRAPHICS 的常量变量设置为等于011x101。所以稍后在你的程序中你可能想检查这个变量是否被定义。然后你使用#ifdef,当你想检查这个变量是否被定义时,#ifndef 如果没有。希望能帮到你。