【问题标题】:difference between #if defined(WIN32) and #ifdef(WIN32)#if defined(WIN32) 和 #ifdef(WIN32) 之间的区别
【发布时间】:2010-12-15 09:57:37
【问题描述】:

我正在编译将在 linux gcc 4.4.1 C99 上运行的程序。

我只是将我的#defines 放入以分隔将在 Windows 或 linux 上编译的代码。但是,我得到了这个错误。

error: macro names must be identifiers.

使用此代码

#ifdef(WIN32)
/* Do windows stuff
#elif(UNIX)
/* Do linux stuff */
#endif

但是,当我更改为这个时,错误已得到修复:

#if defined(WIN32)
/* Do windows stuff
#elif(UNIX)
/* Do linux stuff */
#endif

我只是想知道为什么会出现这个错误以及为什么 #defines 不同?

非常感谢,

【问题讨论】:

    标签: c


    【解决方案1】:

    如果您使用#ifdef 语法,请删除括号。

    两者的区别在于#ifdef只能使用单个条件,
    #if defined(NAME) 可以做复合条件。

    例如你的情况:

    #if defined(WIN32) && !defined(UNIX)
    /* Do windows stuff */
    #elif defined(UNIX) && !defined(WIN32)
    /* Do linux stuff */
    #else
    /* Error, both can't be defined or undefined same time */
    #endif
    

    【讨论】:

    • 是的,但您也可以将#ifdef UNIX 与#ifndef WIN32 级联,并获得相同的灵活性(我同意,可读性差)
    • @jpinto3912 但是|| 会变得更加棘手
    • 要是他们从一开始就使用#if defined(NAME) 并避免创建#ifdef 声明就好了。
    【解决方案2】:

    #ifdef 检查是否已定义该名称的宏,#if 计算表达式并检查真值

    #define FOO 1
    #define BAR 0
    
    #ifdef FOO
    #ifdef BAR
    /* this will be compiled */
    #endif
    #endif
    
    #if BAR
    /* this won't */
    #endif
    
    #if FOO || BAR
    /* this will */
    #endif
    

    【讨论】:

    • 这没有回答问题。该问题询问#if defined#ifdef 之间的区别。
    • 这是#if FOO 和#if defined(FOO) 如何表现不同的最佳解释。
    • 一个有用的答案,因为它显示了 #ifdef#if 之间的细微差别
    【解决方案3】:
    #ifdef FOO
    

    #if defined(FOO)
    

    都是一样的,

    但是要同时做几件事,你可以使用定义的,比如

    #if defined(FOO) || defined(BAR)
    

    【讨论】:

      【解决方案4】:
      #ifdef WIN32
      /* Do windows stuff
      #elif(UNIX)
      /* Do linux stuff */
      #endif
      

      是正确的

      【讨论】:

      • 注意#ifdef检查WIN32是否定义,而#elif检查UNIX
      猜你喜欢
      • 2011-04-17
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 2012-01-26
      • 2015-04-17
      • 1970-01-01
      相关资源
      最近更新 更多