Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 我可以在C宏中使用#if指令吗?_Objective C_C_Macros - Fatal编程技术网

Objective c 我可以在C宏中使用#if指令吗?

Objective c 我可以在C宏中使用#if指令吗?,objective-c,c,macros,Objective C,C,Macros,我想声明一个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*)\\ #endi

我想声明一个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
指令。有什么方法可以做到这一点吗?

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

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


然而,从我的观点来看,你的要求没有什么特别糟糕的错误。我曾考虑在我自己的解析器中实现这一点,但后来放弃了。

如果这只是关于一小部分类型(这里我使用
toto
),所有这些类型都由一个令牌标识符标识,那么您可以使用类似

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

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