首先,我的问题是理解#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
}但其他人,虽然我读到了他们,但我无法理解。它们似乎也是非常相似的术语,但我怀疑它们的作用是否相似。我们将非常感谢您的帮助。
发布于 2016-05-07 19:48:27
宏由在运行时不知道变量值的预处理器展开。它只涉及文本替换(或比较预处理器已知的符号)。你的线路
#if Compare == LINUX_GRAPHICS将扩展到
#if Compare == 011x101由于“比较”与"011x101“不同,它的计算结果为false。实际上,我甚至不能百分之百地肯定这一点,但重点是:您将预处理指令与在运行时进行评估的变量混合在一起。这是不理智的。没有预处理指令来替换C++语句。
对于大多数传统的宏用例,现在有更好的方法。如果您真的不需要使用宏,最好不要使用它们。这使得阅读代码变得极其困难。我不明白代码中的宏是如何工作的,除非我真的需要它,否则我不想知道:P),还有其他宏的问题,可能导致程序中很难找到bug。在使用宏之前,我建议您首先考虑是否没有一种更自然的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我写“排除”是为了强调它对代码的可读性的坏影响。如果在普通代码块中过度使用#ifdef或#ifndef,将非常难以阅读。
发布于 2016-05-07 19:44:57
#if没有任何关于Compare或它包含的值的概念,所以它可能没有做您想做的事情。
请记住,预处理程序会替换纯文本。
该语句将展开,从#if中可以看到
#if Compare == 011x101并被扩展为
#if 0 == 011x101这肯定不会在预处理阶段产生true。
#ifdef和#ifndef指令检查预处理符号是否为#define'd,使用该指令(<-)或编译器预处理器选项(最常见的是-D<preprocessor-symbol>)。
这些并不关心预处理符号是否带有空值或其他东西。一个简单的
#define MY_CONDITION或
-DMY_CONDITION足以满足
#ifdef MY_CONDITION展开随后出现的文本(或用#ifndef隐藏它)。
Compare声明不是预处理符号,也不能与#ifdef或#ifndef一起合理使用。
发布于 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页)。
https://stackoverflow.com/questions/37092913
复制相似问题