#if定义的MACRO是否相当于#ifdef MACRO?

msc*_*msc 16 c macros c-preprocessor

我有代码,我想有两种模式,debugverbose.我在我的头文件中定义它们,

#define verbose TRUE
#define debug TRUE
Run Code Online (Sandbox Code Playgroud)

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

#if(debug)
  //code
#endif
Run Code Online (Sandbox Code Playgroud)

但使用起来更合适

#ifdef debug
  // code
#endif
Run Code Online (Sandbox Code Playgroud)

我读了一些关于预处理器宏的内容,但当时没有意义.所以,我有疑问,#if defined MACRO相当于#ifdef MACRO?哪个更好地启用/禁用特定代码段?

gna*_*729 18

#ifdef MACRO
#if defined (MACRO)
Run Code Online (Sandbox Code Playgroud)

会做同样的事情.但是,定义的(MACRO)只是一个在#if内部计算为0或1的表达式,它可以与其他表达式组合.例如

#if defined (MACRO) && ! defined (MACRO2)
    // Do this
#else
    // Do that
#endif
Run Code Online (Sandbox Code Playgroud)

尝试用#ifdef做到这一点 - 你不能,除非你的代码变得非常笨拙.

  • `defined`不需要括号.它有两种形式:`defined(identifier)`和`defined identifier`. (3认同)

i48*_*486 7

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

#if MACRO类似#ifdef MACRO但不是100%.如果MACRO0那么#if MACRO将是负面的-它需要MACRO加以界定和不可0.#ifdef仅检查是否定义了甚至没有值(#define MACRO).

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

#define FLAG_X 1 // or 0


Dre*_*mer 7

不,他们完全不相同.一#if MACRO,如果分支被编译MACRO的计算结果为非零.在另一方面,#ifdef MACRO如果分支被编译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

}
Run Code Online (Sandbox Code Playgroud)

将输出

#if VAR_SET_TO_TRUE
#ifdef VAR_SET_TO_TRUE
#ifdef VAR_SET_TO_FALSE
Run Code Online (Sandbox Code Playgroud)

请注意,该行printf("#ifdef VAR_SET_TO_FALSE\n");是在printf("#if VAR_SET_TO_FALSE\n");没有行的情况下编译的.第一个是编译的,因为VAR_SET_TO_FALSE定义,即使它的值是false.