【问题标题】:Can't resolve an identifier issue in NetBeans无法解决 NetBeans 中的标识符问题
【发布时间】:2015-08-08 03:45:15
【问题描述】:
我第一次尝试设置 NetBeans 8.1 Beta 以运行我的 C 代码。似乎我无法解决未知标识符问题!版本如下:
以下截图来自主要代码:
尽管有错误,但代码编译成功。据我了解,我已将 include 文件夹引入 NetBeans(见下文),但看起来我做错了什么,因为问题仍然存在。
我按照here 的建议重新解析了项目,并手动将include 目录添加到我的项目属性中。
但仍然没有成功。我还需要做什么?
【问题讨论】:
标签:
c
gcc
netbeans
header-files
netbeans-8.1
【解决方案1】:
这实际上是 C 的一个相当迷人的历史小怪癖,我怀疑你已经遇到过。基本上发生的事情是 Netbeans 仅解析包含的头文件以找出已声明的函数。由于您没有包含 sleep (unistd.h) 的标头,Netbeans 不知道它并因此感到困惑。
这现在提出了一个问题,即它到底是如何编译的。嗯,这就是有趣的地方。事实证明,在 C 中,有 implicit function declarations。换句话说,如果你使用一个函数而不声明它,编译器将继续使用卡车并假设它接受你给它的任何类型的参数并且它返回一个 int。
幸运的是,真正的 sleep 版本与这个隐式版本的链接是兼容的,因此当链接到默认库时,你很幸运,它找到了 sleep。
注意:来自 Netbeans 的警告是正确的。你碰巧遇到了“它对你有用,但不保证能工作”的情况(欢迎使用 C!),你应该尽量避免这些情况。在这种情况下,您可以采取的最直接的步骤是增加警告。
使用适当的警告级别,您会看到如下内容:
test.c: In function 'main':
test.c:4:2: warning: implicit declaration of function 'sleep' [-Wimplicit-function-declaration]
sleep(5);
^
随后会提示您需要#include <unistd.h>。
tl;dr:添加 #include <unistd.h> 并提高您的警告(至少类似于 -Wall -Wextra),无论 Netbeans 采用何种方式。