-5

我正在努力学习C,为了好玩。我正在使用 Linux 发行版。我正在尝试编译一个使用kbhit(). 我找到了一种使用 TurboC ( http://www.sandroid.org/TurboC/#Download ) 的方法。

我按照说明操作,但make给了我这个:

gettext.c: Dans la fonction « gettextTurboC »:
gettext.c:93:13: warning: les cibles pointées dans l'affectation de « int8_t * » {alias « signed char * »} vers « uint8_t * » {alias « unsigned char * »} diffèrent dans la plage signée [-Wpointer-sign]
   TurboData = (int8_t *) dest;
             ^
In file included from TurboC.h:60,
                 from conio.h:49,
                 from gettext.c:42:
TurboC.h:250:14: error: expected « ) » before « int32_t »
 #define long int32_t
              ^~~~~~~
/usr/include/curses.h:1238:66: note: dans l'expansion de la macro « long »
 #define PAIR_NUMBER(a) (NCURSES_CAST(int,((NCURSES_CAST(unsigned long,(a)) & A_COLOR) >> NCURSES_ATTR_SHIFT)))
                                                                  ^~~~
gettext.c:124:10: note: pour correspondre à ce « ( »
  Color = PAIR_NUMBER (ch & A_COLOR);
          ^~~~~~~~~~~
gettext.c:125:23: warning: les cibles pointées dans le passage de l'argument 2 de « pair_content » diffèrent dans la plage signée [-Wpointer-sign]
  pair_content (Color, &dFore, &dBack);
                       ^~~~~~
In file included from TurboC.h:60,
                 from conio.h:49,
                 from gettext.c:42:
/usr/include/curses.h:746:28: note: « short int * » attendu mais l'argument est de type « uint16_t * » {alias « short unsigned int * »}
 extern NCURSES_EXPORT(int) pair_content (NCURSES_PAIRS_T,NCURSES_COLOR_T*,NCURSES_COLOR_T*);  /* implemented */
                            ^~~~~~~~~~~~
gettext.c:125:31: warning: les cibles pointées dans le passage de l'argument 3 de « pair_content » diffèrent dans la plage signée [-Wpointer-sign]
  pair_content (Color, &dFore, &dBack);
                               ^~~~~~
In file included from TurboC.h:60,
                 from conio.h:49,
                 from gettext.c:42:
/usr/include/curses.h:746:28: note: « short int * » attendu mais l'argument est de type « uint16_t * » {alias « short unsigned int * »}
 extern NCURSES_EXPORT(int) pair_content (NCURSES_PAIRS_T,NCURSES_COLOR_T*,NCURSES_COLOR_T*);  /* implemented */
                            ^~~~~~~~~~~~
make: *** [Makefile:126: gettext.o] Error 1

我真的不知道如何处理这个错误:

TurboC.h:250:14: error: expected « ) » before « int32_t »
#define long int32_t

有人可以帮助我吗?

4

3 回答 3

5

免责声明:我将在本世纪研究 Turbo C 的有用性问题搁置一旁。

问题在于 TurboC.h:250 的宏定义:

#define long int32_t

long这是一次尝试通过重新定义内置类型int32_t。后者在 中定义stdint.h,由编译器供应商提供。的定义int32_t使得它最终映射到一个 32 位长的内置有符号整数类型。鉴于现代主流架构int的长度为 32 位,典型的定义int32_t如下所示:

typedef int int32_t;

在任何情况下,int32_t都是一个 typedef-name。

long将via定义int32_t为宏意味着所有后续出现的 tokenlong都被替换为 token int32。除其他后果外,这破坏了合法的构造,例如unsigned long:在宏扩展之后,此构造呈现为unsigned int32_t.

现在,unsigned与 typedef-name 结合是非法的。C 语法规定,要指定整数类型,我们必须使用typedef -name关键字组合,例如unsignedand long,但不能同时使用两者。

GCC 如何报告这个错误有点令人困惑。在处理语句时,

Color = PAIR_NUMBER (ch & A_COLOR);

它扩展了类似函数的宏PAIR_NUMBER,它的定义方式是它包含一系列标记unsignedlonglong然后进一步扩展为int32_t,产生一系列标记unsignedint32_t。在扩展的地方,编译器不期望 typedef-name 跟随unsigned,因为语法禁止这样做。

然后它假定这种无效的标记组合是某处缺少右括号的结果。在这种情况下,这种假设是错误的,并导致令人困惑的错误消息。

于 2019-01-13T12:43:11.037 回答
2

您尝试使用的“TurboC”项目可能仅适用于作者计算机的特定 gcc 版本上的简单程序。错误消息表明主要的、无法修复的问题。我建议不要尝试使用它。

相反,您可以通过其他方式学习 C,而无需尝试构建 Turbo C 源代码。如果您正在寻找类似的东西,那么也许可以搜索ncurses示例程序或教程。

一旦您更好地学习该语言,您可能能够回到您现在正在查看的原始源代码,并能够直接将其移植到 ncurses。

于 2019-01-13T12:42:57.813 回答
1

我正在努力学习C,为了好玩。我正在使用 Linux 发行版。

Linux 发行版是学习 C 的绝佳选择。请注意,它是由免费软件组成的,您可以学习其源代码。通过研究用 C 编写的小型自由软件程序的源代码(例如coreutils中的那些,或者像sash这样的简单shell等),您将学到很多东西。

如果你想学习 C 编程,首先从使用标准流的简单命令行程序开始(直接处理键盘的程序很复杂,不适合新手),并首先限制自己只使用C 标准库

(您问题中的代码不在标准 C 中 - 因为它使用了一些外部库 - ;我不建议一开始尝试)

后来,当你对C 编程语言更加熟悉时,你可以使用一些外部。Linux 发行版有很多。您可能需要为它们安装开发,例如libncurses-dev在 Debian 或 Ubuntu 上为ncurses.

C 中一个非常重要的概念是未定义的行为。更多地了解它,避免它,害怕它。

我正在尝试编译一个使用 kbhit() 的程序

请注意,kbhitand<conio.h>不在 C11 标准中(请参阅n1570 ...),并且它们不在C 标准库中,因此不要使用它们(并且在 Linux 或 POSIX 上找不到任何直接等效项)。

在 Linux 上,您可能想要使用ncurses。当然,您需要花几天时间学习它并研究它的文档。你不会找到直接等价于kbhit. 阅读NCURSES 编程方法

您可能想要使用一些非标准库(Linux 有很多)。然后阅读Program Library HowTo

终端(和终端仿真器,以及线路规程)是一个复杂的东西。阅读The TTY demystifiedtermios(3)pty(7)。您真的想使用一些库,例如ncurses(或者也许readline)。

geany不是编译器,而是源代码编辑器。请参阅相关问题的答案。

您可能想使用一些构建自动化工具,例如 GNU make。它将为您运行gcc编译器。所以请阅读如何调用 GCC

一旦您熟悉了 C 编程,您可能想了解更多有关 Linux 编程的信息,因此请阅读ALP

PS。TurboC是一个古老的 C 编译器(不符合标准),您甚至应该忘记它。它在 Linux 上不存在。GCC 是一个良好的、符合标准的 C 编译器。您应该将它与所有警告和调试信息一起使用,即yoursourcecode.cgcc -Wall -Wextra -g yoursourcecode.c -o yourbinaryLinux 上编译。另请阅读如何调试小程序valgrind工具对于调试内存泄漏也非常有用(在 Linux 上可用)。

在 StackOverflow 上提问时,请务必将您的语言环境设置为英语。我们不应该用法语破译编译器诊断。

于 2019-01-13T12:56:38.390 回答