【问题标题】:C-style macro compilationC风格的宏编译
【发布时间】:2019-08-20 11:11:25
【问题描述】:

我有以下宏:

#define oslock_TryAcquire(pLock) { \
        INITIALIZED_ASSERT(pLock) \
        acquire(pLock)}

编译时我得到:

error: expected expression before ‘{’ token
 #define oslock_TryAcquire(pLock ) { \

更新: ^ 我收到“跟进”错误:

note: in expansion of macro ‘oslock_TryAcquire’
         if(!oslock_TryAcquire(&pLock)){
             ^~~~~~~~~~~~~~~~~~~~~~

我不明白什么是问题?将得到glsd的建议

【问题讨论】:

  • 问题可能出在您使用宏的地方。请为此提供一个示例。
  • 错误可能在上下文中。宏定义本身是正确的。请显示实际重现问题的最小源代码。
  • 请创建minimal reproducible example 向我们展示。并包括 full 和 complete 错误输出。
  • 与编译错误无关,每次函数调用后都需要一个分号。
  • 你有它......你不能有例如if ({some statements}),这只是无效的 C。一些编译器具有 non-portable extensions 允许将语句作为表达式。例如GCC have it。我真的不建议你使用这样的扩展。请记住,宏是不是函数。也许你真正想要的是一个实际的(可能是inline)函数?

标签: c compiler-errors macros


【解决方案1】:

宏是一种美化的文本替换。您的来电

if(!oslock_TryAcquire(&pLock))

扩展到

if(!{INITIALIZED_ASSERT(&pLock) acquire(&pLock)})

这是几种不同方式的无意义语法。使用函数而不是宏。

【讨论】:

    猜你喜欢
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    相关资源
    最近更新 更多