【问题标题】:Conditional macro #define for a function - causing: "function" redefined warning函数的条件宏#define - 导致:“函数”重新定义警告
【发布时间】:2011-02-02 00:09:35
【问题描述】:

我刚刚看到这个帖子,描述了如何添加条件宏: Conditional value for a #define

但就我而言,我是在条件内定义一个函数。

#if TARGET_IPHONE_SIMULATOR

#define doSomething(){\
    \\ does something
}\

#else

#define doSomething(){\
    \\ does something else
}\

#endif

这确实有效,但我导致 gcc 编译器抛出此警告:

"doSomething" redefined
This is the location of the previous arguments

是否有任何解决方法可以帮助消除警告?

更新:

所以我尝试在我的定义中包含条件:

#define doSomething(){\

#if TARGET_IPHONE_SIMULATOR
    \\ do something
#else 
    \\ do something else
#endif

}\

但这会引发错误:

error: '#' is not followed by a macro parameter.

【问题讨论】:

    标签: gcc macros c-preprocessor


    【解决方案1】:

    我找到了问题的答案here

    结论:不能在#define 中包含#ifdef 等,因为每行应该只有一个预处理指令。

    虽然我们可以用反斜杠“\”换行,但这有助于编写可读的多行宏, 但预处理器会将其视为一行:

    #define doSomething(){ #if TARGET_IPHONE_SIMULATOR ... #endif }
    

    抛出此错误:

    error: '#' is not followed by a macro parameter.
    

    这是有道理的,所以我将不得不重新考虑我的实现。

    【讨论】:

      【解决方案2】:

      你的想法有一个怪癖,这是类比/扩展。 doSomething() 必须被视为类似函数的宏。因此,它的定义是矛盾的。缩小看下图:

      doSomething() {
      #if TARGET_IPHONE_SIMULATOR
         // conditionally compiled code
      #else
         // platform-specific code
      #endif
      }
      

      【讨论】:

      • 您忘记了 doSomething 是一个已定义的宏。如果我有 #define doSomething() #if ... 这将破坏宏,你会得到错误:'#' 后面没有宏参数。
      【解决方案3】:

      此外,这可能会解决您收到的错误:
      ### 在宏定义中具有特殊用途。 # 用于用双引号将宏参数括起来。 ## 用于连接两个宏参数。示例:
      #define ABC(X) #X
      ABC(hello) 生成 "hello"
      #define XYZ(X,Y) X##Y
      XYZ(O,K) 生成 OK。 请注意,此功能(可能)是 ANSI C 独有的。
      另外,你为什么要使用这样的宏?函数可能更适合您吗?

      【讨论】:

      • “另外,你为什么要使用这样的宏?”没错,当时的逻辑很糟糕,让我重新思考目的和实施。
      【解决方案4】:

      要考虑的一个选项是在宏中创建一个将在编译时解析的条件。考虑以下几点:

      如果我想根据“c”的值调用不同的函数作为预处理器操作,我可以定义一个静态检查“c”值的宏。

      #define AorB(c) ((c>0) ? (Do_A(c)) : (Do_B(c)))
      

      然后,如果您配置一个优化级别以删除永远无法到达的分支,它应该删除未执行的任何情况。这可能不是您想要的。

      【讨论】:

        猜你喜欢
        • 2012-09-11
        • 1970-01-01
        • 1970-01-01
        • 2018-03-31
        • 2012-12-31
        • 2016-03-28
        • 1970-01-01
        • 2016-09-18
        • 2015-09-29
        相关资源
        最近更新 更多