【发布时间】:2015-06-26 12:47:28
【问题描述】:
Ask Ubuntu 上最近有一篇帖子,其中 OP 试图编译一个包含 term.h 的程序。当代码有#include <term.h>时,错误是:
In file included from clear_screen_UNIX.c:5:0:
clear_screen_UNIX.c:9:6: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘->’ token
void clear_screen(void) {
^
clear_screen_UNIX.c: In function ‘main’:
clear_screen_UNIX.c:23:14: error: called object is not a function or function pointer
clear_screen();
^
clear_screen_UNIX.c:26:14: error: called object is not a function or function pointer
clear_screen();
然后,OP 包含了到 term.h (#include "/usr/include/term.h") 的完整路径,这导致了更有用的消息:
In file included from clear_screen_UNIX.c:7:0:
/usr/include/term.h:125:21: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘->’ token
#define CUR cur_term->type.
^
/usr/include/term.h:202:40: note: in expansion of macro ‘CUR’
#define clear_screen CUR Strings[5]
^
clear_screen_UNIX.c:9:6: note: in expansion of macro ‘clear_screen’
void clear_screen(void) {
^
clear_screen_UNIX.c: In function ‘main’:
clear_screen_UNIX.c:23:14: error: called object is not a function or function pointer
clear_screen();
^
clear_screen_UNIX.c:26:14: error: called object is not a function or function pointer
clear_screen();
这些消息清楚地表明问题是由宏扩展引起的。
我自己也验证了结果。我想知道为什么在给出完整路径时 GCC 会产生更好的错误。我可以让它产生与系统包含语法类似的消息吗?
我使用的是 GCC 4.9.2,我怀疑 OP 使用的是 GCC 4.8.2(鉴于 Ubuntu 的版本)。
【问题讨论】:
-
对我来说看起来像一个 gcc 错误
-
@user2225104 老实说,我不经常用 C 编写代码(并且通过扩展,使用 GCC 或其他 C 编译器)来了解这里的预期行为。
-
如果你改用 llvm/clang 会发生什么?
-
@uchuugaka 不知道,我手头没有带有clang的系统。有的话我会更新的。
标签: c gcc compiler-errors