#define 错误:预期的声明说明符或 '...' 在 '(' 标记之前

Posted

技术标签:

【中文标题】#define 错误:预期的声明说明符或 \'...\' 在 \'(\' 标记之前【英文标题】:#define error: expected declaration specifiers or '...' before '(' token#define 错误:预期的声明说明符或 '...' 在 '(' 标记之前 【发布时间】:2014-11-20 00:27:29 【问题描述】:

你知道我为什么会从这段代码中得到这些错误吗?

#define container_of(ptr, type, member) (\
    const typeof( ((type *)0)->member ) *__mptr = (ptr);\
    (type *)( (void *) ( (char *)__mptr - offsetof(type,member) ) );)

错误:预期的声明说明符或 '...' 在 '(' 标记 错误:'__mptr' 未声明(在此函数中首次使用)

【问题讨论】:

会不会是__mptr 没有在任何地方声明? 您使用的是 Visual Studio(或任何非 GCC 编译器)吗? 为什么需要括号?他们似乎是问题所在。 这篇文章中没有足够的信息。您是在使用宏时遇到错误,还是在defining宏的行中遇到错误?您能否简要摘录一些编译器错误指向的代码行? 【参考方案1】:

感谢您的帮助!

用每边两个下划线的 typeof 替换 'typeof' 解决了这个问题。

【讨论】:

【参考方案2】:

“typeof”是 GCC 扩展 https://gcc.gnu.org/onlinedocs/gcc/Typeof.html

要使用它,需要使用 -std=gnu11 编译器选项指定 GCC 标准。

【讨论】:

【参考方案3】:

也许你可以用这个替换宏:

#define container_of(ptr, type, member) \ ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))

我猜你的宏中使用括号的方式是问题的原因。

【讨论】:

以上是关于#define 错误:预期的声明说明符或 '...' 在 '(' 标记之前的主要内容,如果未能解决你的问题,请参考以下文章

“&”标记之前的预期声明说明符或“...”

无法解决预期的声明错误[关闭]

Visual Studio,错误:在数组声明中使用 #define 常量时,应为“]”

声明 NSManagedObjectContext 时出错

预期的声明错误 TableView [关闭]

使用 Swift 的预期声明错误