#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#define RANGE(i, min, max) (i<min) || (i>max) ? 1: 0
int main (void )
{
int r;
do
{
do{
r=rand();
} while (RANGE(r, 1, 100));
printf("%d", r);
}
while (!kbhit());
return 0;
}
当我运行此程序时,我发现以下错误:
conio.h:没有这样的文件或目录
如果删除#include "conio.h"
,我会发现以下错误:
架构x86_64的未定义符号:
“_kbhit”,引自:
_main in cckd1NC4.o
ld:找不到架构x86_64的符号
collect2:ld返回1退出状态
我该如何解决这个问题?这些背后的原因是什么?你能告诉我吗?
答案 0 :(得分:4)
#include "something.h"
中的双引号表示文件something.h
出现在当前目录中,即源文件所在的位置。在哪里&lt;&gt; #include <something.h>
中的符号表示,standarad库文件夹中存在something.h,例如/usr/include
文件夹。
conio.h是standarad库的一部分,因此您需要使用&lt;&gt;符号而不是双引号。
您看到的错误是因为链接器无法找到kbhit()
的函数定义来链接您的代码以生成二进制文件/可执行文件。
答案 1 :(得分:4)
conio.h
是一个旧的DOS标题,几乎从未使用过。现在curses.h
中的功能相同。确保您的计算机上安装了curses(或ncurses),然后尝试
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
对于它的价值,RANGE
定义的父母很少;
#define RANGE(i, min, max) (i<min) || (i>max) ? 1: 0
会出现像
这样的问题 if(!RANGE(i, 100 200))
哪个会成为(为了清晰起见而添加了parens)
(!(i<100)) || (i>200)
这不是你想要的。将其定义为
#define RANGE(i, min, max) (((i)<(min)) || ((i)>(max)))
并阅读Macro Pitfalls。
答案 2 :(得分:3)
<lib.h>
中的与#include“lib.h”不同。第一次搜索系统中的头文件包括路径,文件中的第二次搜索包括路径