#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
}
但是其他的,虽然我读过他们,但我无法理解。它们看起来也非常相似,但我怀疑它们的作用是否相似。将不胜感激。
#if
对 Compare
或其包含的值没有任何概念,因此它可能不会按照您的意图进行。
记住预处理器会进行纯文本替换。
声明将从 #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 如果没有。希望能帮到你。
我的问题是首先理解#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
}
但是其他的,虽然我读过他们,但我无法理解。它们看起来也非常相似,但我怀疑它们的作用是否相似。将不胜感激。
#if
对 Compare
或其包含的值没有任何概念,因此它可能不会按照您的意图进行。
记住预处理器会进行纯文本替换。
声明将从 #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 如果没有。希望能帮到你。