【问题标题】:C: Creating and returning a variable in a macroC:在宏中创建和返回变量
【发布时间】:2012-05-04 18:25:03
【问题描述】:

我有点困惑为什么这个 C 宏无法编译:

#define LUA_GET_FIELD(Lua, idx, name, type) (\
    lua_getfield((Lua), (idx), (name)), \
    typeof(lua_to##type) __result = lua_to##type((Lua), -1), \
    lua_pop((Lua), 1), __result)

调用时出现错误:

src/event.lcpp.c:134:15: error: expected primary-expression before ‘typeof’
src/event.lcpp.c:134:15: error: expected ‘)’ before ‘typeof’

如果我将typeof(lua_to##type) 替换为int,也会发生同样的情况,所以我怀疑问题与逗号有关。这样的表达式中间不能声明变量吗?

我知道 gcc 有一个从块返回值的扩展,但我想避免编译器扩展。我也意识到这应该改为内联函数,但现在我很好奇为什么宏不起作用。

【问题讨论】:

  • 表达式 typeof(lua_to##type) 的计算结果为函数类型,而不是 lua_to##type 函数返回的类型。
  • “我想避免编译器扩展” - typeof 是一个编译器扩展,所以如果你愿意使用它,那么下一步可能不会太糟糕。

标签: c macros comma-operator


【解决方案1】:

标准 C 确实不允许您在表达式中任意定义新变量。旧标准甚至不允许它们出现在任何地方,只能在块的开头(也就是说,您也不能将它们与语句混合)。

【讨论】:

  • typeof 也是 GCC 扩展(除非已添加到 C11)。
  • @Mat:C 语言中的typeof 不是违背语言吗?因为它不是强类型。与大多数其他语言相比,类型的概念有点不同。
猜你喜欢
  • 1970-01-01
  • 2016-06-19
  • 2023-04-08
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 2013-10-02
相关资源
最近更新 更多