编译ANSI C book,Linked Lists章节中的错误

nak*_*nak 5 c gcc linked-list ansi

我正在做一些较旧的C书[ANSI C的第一本书]中的一些例子,并在尝试编译此示例代码时遇到错误:

#include <stdio.h>

struct tele_typ {
  char name[30];
  char phone_no[15];
  struct tele_typ *nextaddr;
};

main() {
  struct tele_typ t1 = {"Acme, Sam", "(201) 555-6678"};
  struct tele_typ t2 = {"Dolan, Edith", "(213) 682-3104"};
  struct tele_typ t3 = {"Lanfrank, John", "(415) 718-4581"};
  tele_typ *first;    /* create a pointer to a structure */

  first = &t1;          /* store t1's address in first */
  t1.nextaddr = &t2;    /* store t2's address in t1.nextaddr */
  t2.nextaddr = &t3;    /* store t3's address in t2.nextaddr */
  t3.nextaddr = NULL;   /* store the NULL address in t3.nextaddr */

  printf("\n%s %s %s",first->name,t1.nextaddr->name,t2.nextaddr->name);
}
Run Code Online (Sandbox Code Playgroud)

..和输出gcc newstruct.c -o newstruct:

newstruct.c: In function 'main':
newstruct.c:13:3: error: unknown type name 'tele_typ'
newstruct.c:15:9: warning: assignment from incompatible pointer type [enabled by default]
newstruct.c:20:28: error: request for member 'name' in something not a structure or union
Run Code Online (Sandbox Code Playgroud)

这是关于链接列表的第10.4章.书中有错误吗?或标准中有什么变化/ gcc version 4.6.2 20120120 (prerelease)?谢谢!

Kei*_*son 2

您的代码存在以下错误,其中一些是轻微错误。

  1. main()需要是int main(void)。形式main()是旧式定义;从 1989 年 ANSI C 标准开始,它已被弃用,并且在 1999 年 ISO C 标准中完全无效,该标准放弃了“隐式 int”规则。使用(void)而不是()明确表示main没有参数;该()形式仍然有效,但自 1989 年以来已被弃用。为了向后兼容,许多 C 编译器将接受此类旧式功能,但至少会在一致模式下发出警告。您应该了解如何为您的编译器启用此类警告。

  2. tele_typ *first;需要是struct tele_typ *first;。这是主要问题。(添加 atypedef是解决此问题的另一种方法,但绝对没有必要。代码已经将类型引用为struct tele_typ;您只需要一致地这样做。)请注意,在 C++ 中,您可以将类型引用struct tele_typtele_typ- - 当然,C++ 是一种不同的语言,具有不同的规则。

  3. 您打印的字符串\n末尾应该有一个;一开始你不需要它。

    printf("%s %s %s\n",first->name,t1.nextaddr->name,t2.nextaddr->name);

  4. 你应该在你的函数return 0;结束之前有一个。从 1989 年 ANSI C 标准(或等效的 1990 年 ISO C 标准)开始,在不返回值的情况下脱离末尾会向调用环境返回未定义的结果。按照 1999 年的标准,从 的末端掉落会产生隐含的影响,但明确地说明这一点也没有什么坏处。}mainmainmainreturn 0;

t1启用警告后,某些编译器可能会抱怨、t2和 的声明中缺少初始值设定项t3,因为您没有为nextaddr成员提供值。这是可以的,因为 (a) 只要你有一个初始化器,任何未指定的成员都会被初始化为零(在指针的情况下,初始化为空指针),并且 (b) 你稍后显式地为这些成员赋值。

我看到你正在使用 gcc。要获得一组好的警告,您可以使用以下命令:

gcc -ansi -pedantic -Wall -Wextra
Run Code Online (Sandbox Code Playgroud)

如果您想针对较新版本的 C 标准进行测试,请将 更改-ansi-std=c99或。-std=c1x请注意,使用-ansi或 选项之一-std=...可能会禁用某些非标准扩展。有时您需要编写不可移植的代码;在这种情况下,您可以删除该选项,也可能删除该选项-pedantic。但这个程序不使用任何扩展,也不需要。