gpt4 book ai didi

c++ - #if 对比#ifndef 对比#ifdef

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:25 24 4
gpt4 key购买 nike

我的问题首先是理解#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 == LINUX_GRAPHICS

将扩展到

#if Compare == 011x101

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

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

附言:

#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,它将非常难以阅读。

关于c++ - #if 对比#ifndef 对比#ifdef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37092913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com