0
#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”,引用自:
cckd1NC4.o 中的 _main
ld:未找到架构 x86_64 的
符号 collect2:ld 返回 1 个退出状态

我怎么解决这个问题?这些背后的原因是什么?你能告诉我吗?

4

3 回答 3

3

中的双引号#include "something.h"表示文件something.h存在于当前目录中,即源文件所在的位置。其中 <> 符号#include <something.h>表示 something.h 存在于标准库文件夹中,例如/usr/include文件夹。conio.h 是标准库的一部分,因此您需要使用 <> 符号而不是双引号。您看到的错误是因为链接器无法找到kbhit()与您的代码链接以使二进制/可执行文件的函数定义。

于 2012-03-05T15:10:44.960 回答
3

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))

这将成为(为清楚起见添加了括号)

(!(i<100)) || (i>200)

这不是你想要的。将其定义为

#define RANGE(i, min, max) (((i)<(min)) || ((i)>(max)))

并且,阅读Macro Pitfalls

于 2012-03-05T17:18:33.743 回答
2

在 C中,#include<lib.h>与 #include "lib.h" 不同。第一个在系统包含路径中搜索头文件,第二个在文件包含路径中搜索

于 2012-03-05T15:12:12.060 回答