我第一次尝试设置NetBeans 8.1 Beta来运行我的C代码。好像我无法解决未知的标识符问题!版本如下:
以下截图来自主要代码:
尽管出现错误,但代码编译成功。据我所知,我已将include
文件夹引入NetBeans(见下文),但看起来我做错了,因为问题仍然存在。
我按照建议here重新解析了项目,并手动将include
目录添加到我的项目属性中。
但仍然没有成功。我还需要做什么?
答案 0 :(得分:2)
这实际上是一个相当迷人的C历史怪癖,我怀疑你已经遇到过。基本上发生的事情是,Netbeans只解析包含的头文件,以确定已声明的函数。由于你没有包含睡眠标题(unistd.h),Netbeans并不知道它,因此感到困惑。
这现在提示了这个世界如何编译的问题。嗯,这就是它变得有趣的地方。事实证明,在C中,有implicit function declarations。换句话说,如果你在没有声明它的情况下使用函数,编译器将继续运输并假设它接受你给它的任何类型的参数并且它返回一个int。
幸运的是,事实证明睡眠的真实版本与这个隐式版本的链接是兼容的,因此当发生与默认库的链接时,你很幸运,它正在寻找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的做法是什么。