Objective c 宏可以接受类型吗?

Objective c 宏可以接受类型吗?,objective-c,c,c-preprocessor,Objective C,C,C Preprocessor,除非我的理解不正确,否则以下宏 int i; // for loop const char* ctype; // proprietary type string void** pool = malloc(sizeof(void*) * (nexpected - 1)); size_t poolc = 0; #define SET(type, fn) type* v = (pool[poolc++] = malloc(sizeof(type))); \ *v = (typ

除非我的理解不正确,否则以下宏

int i; // for loop
const char* ctype; // proprietary type string
void** pool = malloc(sizeof(void*) * (nexpected - 1));
size_t poolc = 0;

#define SET(type, fn) type* v = (pool[poolc++] = malloc(sizeof(type)));         \
    *v = (type) fn(L, i)
#define CHECK(chr, type, fn) case chr:                                          \
    SET(type, fn);                                                              \
    break

switch (ctype[0]) {
  CHECK('c', char, lua_tonumber);
}
应该扩展到

int i; // for loop
const char* ctype; // proprietary type string
void** pool = malloc(sizeof(void*) * (nexpected - 1));
size_t poolc = 0;

switch (ctype[0]) {
  case 'c':
    char* v = (pool[poolc++] = malloc(sizeof(char)));
    *v = (char) lua_tonumber(L, i);
    break;
}
但经过编辑,我得到:

src/lua/snip.m:185:16: error: expected expression
    CHECK('c', char, lua_tonumber);
               ^
src/lua/snip.m:181:9: note: expanded from macro 'CHECK'
    SET(type, fn);                                                              \
        ^
src/lua/snip.m:178:23: note: expanded from macro 'SET'
#define SET(type, fn) type* v = (pool[poolc++] = malloc(sizeof(type)));         \
                      ^
src/lua/snip.m:185:5: error: use of undeclared identifier 'v'
    CHECK('c', char, lua_tonumber);
    ^
src/lua/snip.m:181:5: note: expanded from macro 'CHECK'
    SET(type, fn);                                                              \
    ^
src/lua/snip.m:179:6: note: expanded from macro 'SET'
    *v = (type) fn(L, i)
     ^
2 errors generated.
这是怎么回事?预处理器不是文本替换引擎吗?为什么它要对表达式求值

请记住,虽然这看起来像是纯C,但实际上这是C11标准下的铿锵目标C(注意
.m
)。不确定这是否有什么不同


我不知道如何在不扩展每个条目的代码的情况下继续操作。

您的理解是正确的!但是您遇到了C语言的一个怪癖

您可以通过在
大小写
之后插入空语句(例如,
0;
)或将
大小写
正文括在一组大括号中来解决此问题。一种切实可行的方法是将
CHECK
重新定义为:

#define CHECK(chr, type, fn) \
    case chr: { SET(type,fn); } break;

啊哈!每天学习新的东西。这解决了它;将在8分钟内接受。无需
0
,一个简单的
也可以。@Lundin如果你读了OP,它会告诉你。C11标签应该用于使用C11标准特有功能的问题,这里不是这样。如果你阅读标签维基,它会告诉你。@Lundin我很清楚标签是如何工作的。我是根据C11标准编译的。在回答之后,很明显这不是C11问题。然而,当我问起C11是否改变了宏的工作方式时,我不知道。这与当时的问题有关。欢迎您搜索与C/C++相关的“标签纳粹”讨论相关的Meta。您可以随时将标签从您的帖子中远程删除,而不必留下恶意评论。“这不是世界末日。”伦丁,如果你看了这篇文章,你会发现我是这样做的。谢谢你的关心。