【问题标题】:Can I use #if directive in a C macro?我可以在 C 宏中使用 #if 指令吗?
【发布时间】:2013-10-06 08:07:45
【问题描述】:

我想声明一个根据传递给宏的参数定义的 C 宏。换句话说,我想在 C 宏中使用 #if 指令。应该是这样的:

#define XLType_id 1

#define XLTypeCastToVoidPointer(type) #if XLType_##type \\
(__bridge void *)\\
#define XLTypeCast(type) (__bridge id)\\
#else \\
&\\
#define XLTypeCast(type) *(type*)\\
#endif

我想使用XLTypeCastToVoidPointer()XLTypeCast() 宏来重新转换(void *) 类型的变量。

- (NSInteger) value{
    NSInteger returnValue = 100;

    // the same as -> void *aValueToReturn = &returnValue;
    void *aValueToReturn = XLTypeCastToVoidPointer(NSInteger) returnValue;

    // Do something with this void pointer here.

    // the same as -> return *(NSInteger*) aValueToReturn;
    return XLTypeCast(NSInteger) aValueToReturn;
}


- (NSString*)string{
    NSString* aString = @"a string";

    // the same as -> void *aValueToReturn = &returnValue;
    void *aValueToReturn = XLTypeCastToVoidPointer(id) aString;

    // Do something with this void pointer here.

    // the same as -> return *(NSInteger*) aValueToReturn;
    return XLTypeCast(id) aString;
}

但是,似乎不允许在 C 宏中使用 #if 指令。有没有办法做到这一点?

【问题讨论】:

  • 不,您不能在预处理器宏中定义预处理器宏。
  • 不仅不能这样,预处理阶段对类型也一无所知。它只知道令牌序列。或许你应该告诉我们你到底想要达到什么目标?
  • 也输入void*,因为你想在这里做这件事对我来说完全是多余的。在 C 中,void* 被隐式转换为任何其他数据指针而不会出现问题。 (我的猜测是在 Objective-C 中这将是相同的,但我不是这方面的专家。)

标签: objective-c c macros


【解决方案1】:

不,你不能。语言的定义不允许这样做。编译器也不支持这个。

C 预处理器被指责过于复杂。现代语言不使用类似的功能。你问的东西将来不太可能出现。

不过,从我的角度来看,您所问的问题并没有什么特别不好的地方。我曾考虑在自己的解析器中实现这一点,但后来放弃了。

【讨论】:

    【解决方案2】:

    如果这真的只是关于一小部分类型(这里我使用 bridgetoto ),它们都用一个令牌标识符来标识,你可以使用类似的东西

    #define XLTypeCastToVoidPointer(T) XLTypeCast_ ## T
    #define XLTypeCast_bridge(X) (bridge)(X)
    #define XLTypeCast_toto(X) *((toto*)(X))
    

    【讨论】:

      猜你喜欢
      • 2017-11-07
      • 2011-10-04
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      相关资源
      最近更新 更多