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)?谢谢!
您的代码存在以下错误,其中一些是轻微错误。
main()需要是int main(void)。形式main()是旧式定义;从 1989 年 ANSI C 标准开始,它已被弃用,并且在 1999 年 ISO C 标准中完全无效,该标准放弃了“隐式 int”规则。使用(void)而不是()明确表示main没有参数;该()形式仍然有效,但自 1989 年以来已被弃用。为了向后兼容,许多 C 编译器将接受此类旧式功能,但至少会在一致模式下发出警告。您应该了解如何为您的编译器启用此类警告。
tele_typ *first;需要是struct tele_typ *first;。这是主要问题。(添加 atypedef是解决此问题的另一种方法,但绝对没有必要。代码已经将类型引用为struct tele_typ;您只需要一致地这样做。)请注意,在 C++ 中,您可以将类型引用struct tele_typ为tele_typ- - 当然,C++ 是一种不同的语言,具有不同的规则。
您打印的字符串\n末尾应该有一个;一开始你不需要它。
printf("%s %s %s\n",first->name,t1.nextaddr->name,t2.nextaddr->name);
你应该在你的函数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。但这个程序不使用任何扩展,也不需要。