Macro:#if定义的MACRO是否等效于 #ifdefMACRO

我有代码,我想有两个模式,debugverbose

#define verbose TRUE
#define debug TRUE

在我的代码到目前为止,我刚刚使用

#if(debug)
  //code
#endif

但是它更适合使用吗?

#ifdef debug
  // code
#endif

我读了一些关于预处理器宏的东西,但它当时没有意义。所以,我有一个问题:#if defined MACRO等同于#ifdef MACRO

34
#ifdef MACRO
#if defined (MACRO)

将做完全相同的事情。但是,defined (MACRO) 只是一个表达式,它在 # if 内部评估为 0 或 1,它可以与其他表达式结合使用。例如

#if defined (MACRO) && ! defined (MACRO2)
    // Do this
#else
    // Do that
#endif

尝试使用 # ifdef-你不能,除非你的代码变得非常笨拙。

9

#if defined(MACRO)#ifdef MACRO相同,但更长。另一方面,它允许使用||&&添加额外的条件。

#if MACRO类似于#ifdef MACRO,但不是 100%。如果MACRO0,则#if MACRO将为负-它要求定义MACRO,而不是0

现在使用#if并启用 / 禁用值为 1 或 0 的定义是现代的:

#define FLAG_X 1 // or0
8

不,它们根本不相等。如果MACRO的计算结果为非零,则编译#if MACRO分支。另一方面,如果MACRO定义的,则编译#ifdef MACRO分支,无论其计算结果如何。因此

#include <stdio.h>
#define VAR_SET_TO_TRUE 1
#define VAR_SET_TO_FALSE 0
int main()
{
#if VAR_SET_TO_TRUE
    printf("#if VAR_SET_TO_TRUE\n");
#endif
#if VAR_SET_TO_FALSE
    printf("#if VAR_SET_TO_FALSE\n");
#endif
#if VAR_UNSET
    printf("#if VAR_UNSET\n");
#endif
#ifdef VAR_SET_TO_TRUE
    printf("#ifdef VAR_SET_TO_TRUE\n");
#endif
#ifdef VAR_SET_TO_FALSE
    printf("#ifdef VAR_SET_TO_FALSE\n");
#endif
#ifdef VAR_UNSET
    printf("#ifdef VAR_UNSET\n");
#endif
}

将输出

#if VAR_SET_TO_TRUE
#ifdef VAR_SET_TO_TRUE
#ifdef VAR_SET_TO_FALSE

请注意,printf("#ifdef VAR_SET_TO_FALSE\n");行是编译的,而printf("#if VAR_SET_TO_FALSE\n");行是不编译的。第一个是编译的,因为VAR_SET_TO_FALSE定义的,即使它的值是false

3

如果我正确地阅读你的问题,标题是误导性的,它应该是

Is #if MACRO equivalent to #ifdef MACRO?

它们不是等效的,但它们可以(通常是)都用于指定二进制模式,这些模式是开或关。在我看来,选择是个人偏好的问题。

您使用的是第一个选项,要么有

#define verbose true

#define verbose false

,然后检查模式使用

#if verbose

#if !verbose

实际上,我建议您使用 TRUE 或 1 而不是 true 和 FALSE 或 0 而不是 false,因为 true 和 false 是(或可以是)C / C ++ 值,预处理器无法访问 C / C ++ 值。

无论如何,指定二进制模式的另一种常见方法是定义标志或将其保留为未定义,在这种情况下,您可以使用

#define verbose any thing (including nothing) goes here

或省略 # define。

,然后您可以测试是否定义了标志,或者使用

#ifdef verbose

或其等价物

#if defined(verbose)

注意:在这种情况下,您不是在测试标志的值,您只需要测试它是否被定义。

如果更方便,您还可以测试标志是否未定义

#ifndef verbose

或其等价物

#if !defined(verbose)

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(261)
数据库logo:PHP将徽标添加到存储在数据库中的现有PDF( MySQL)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(32条)