conio.h的C处理器错误

时间:2012-03-05 14:56:43

标签: c macos conio

#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退出状态

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

3 个答案:

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

C #include <lib.h>中的

与#include“lib.h”不同。第一次搜索系统中的头文件包括路径,文件中的第二次搜索包括路径