你能为条件编译定义一个函数式宏吗?

时间:2013-02-04 10:38:39

标签: c macros c-preprocessor

是否可以为条件编译定义一个名为IPHONE_ONLY的宏,如下所示:

IPHONE_ONLY -(void)myMethod {
    //method body
}

IPHONE_ONLY( -(void)myMethod {
    //method body
})

4 个答案:

答案 0 :(得分:3)

即使通常你会用#ifdef包围这个函数,我也用gcc进行了测试,实际上下面也有效。我不知道它是否标准:

#ifdef IPHONE
# define IPHONE_ONLY(...) __VA_ARGS__
#else
# define IPHONE_ONLY(...)
#endif

IPHONE_ONLY(int func(void)
{
    return 12;
})

我从来没有见过这样的代码。编写这样的函数是很常见的:

#ifdef IPHONE
int func(void)
{
    return 12;
}
#endif

你的编辑也会对此感到高兴,因为它理解函数,但不是函数体用作宏参数!

答案 1 :(得分:2)

当然可以,但我认为这不会使您的代码更具可读性

#if on_iphone
# define IPHONE_ONLY(...) __VA_ARGS__
#else
# define IPHONE_ONLY(...) 
#endif

然后您可以在问题中使用第二种方式使用宏。

但这非常丑陋,违背了任何习惯阅读C的人的视觉期望。

答案 2 :(得分:1)

我认为您正在寻找ifdef

#ifdef IPHONE_ONLY
void myMethod(){
    //method body
)
#endif

答案 3 :(得分:0)

#ifdef IPHONE_ONLY
# define MY_METHOD() myMethod();
 void myMethod() {

    ......

 }
#else
# define MY_METHOD()
#endif

在项目的c代码中,您拨打MY_METHOD()

这样可以避免每次在代码中需要时以这种方式调用myMethod()

    for(i=0; i<10; i++) {
        // some thing to do here
#ifdef IPHONE_ONLY
        myMethod();
#endif
        // other thing to do here
    }

根据上面的定义,您将以这种方式调用myMethod();

    for(i=0; i<10; i++) {
        // some thing to do here
        MY_METHOD();
        // other thing to do here
    }

如果定义了IPHONE_ONLY,则预处理器将通过调用函数MY_METHOD()来更改宏myMethod();

如果未定义IPHONE_ONLY,则预处理器将无效地更改MY_METHOD()。就像你的代码中不存在宏调用MY_METHOD()一样。并且不会定义函数void myMethod()