我第一次尝试设置 NetBeans 8.1 Beta 来运行我的 C 代码。似乎我无法解决未知标识符问题!版本如下:
以下屏幕截图来自主要代码:
尽管出现错误,但代码仍会成功编译。据我了解,我已将该include
文件夹引入 NetBeans(见下文),但看起来我做错了,因为问题仍然存在。
我按照此处的建议重新解析了项目,并将目录手动添加include
到我的项目属性中。
但仍然没有成功。我还需要做什么?
我第一次尝试设置 NetBeans 8.1 Beta 来运行我的 C 代码。似乎我无法解决未知标识符问题!版本如下:
以下屏幕截图来自主要代码:
尽管出现错误,但代码仍会成功编译。据我了解,我已将该include
文件夹引入 NetBeans(见下文),但看起来我做错了,因为问题仍然存在。
我按照此处的建议重新解析了项目,并将目录手动添加include
到我的项目属性中。
但仍然没有成功。我还需要做什么?
这实际上是 C 的一个相当迷人的历史小怪癖,我怀疑你已经遇到过。基本上发生的事情是 Netbeans 仅解析包含的头文件以找出已声明的函数。由于您没有包含 sleep 的标头(unistd.h),Netbeans 不知道它,因此感到困惑。
这现在提出了一个问题,即它到底是如何编译的。嗯,这就是有趣的地方。事实证明,在 C 中,存在隐式函数声明。换句话说,如果你在没有声明的情况下使用一个函数,编译器将继续使用卡车并假设它接受你给它的任何类型的参数,并且它返回一个 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:无论 Netbeans 的做法是什么,都可以添加#include <unistd.h>
并提高您的警告(-Wall -Wextra
至少是这样)。