【问题标题】:Compiling with gcc and terminal使用 gcc 和终端编译
【发布时间】:2025-11-28 23:15:02
【问题描述】:

我正在尝试从 http://cocoadevcentral.com/articles/000081.php 编译 C 文件,我从字面上复制和粘贴,所以我不相信有任何类型的语法错误,但我不断收到错误。我不知道我做错了什么。我正在使用一个名为 TextWrangler 的文本编辑器来保存我的文字并保存我的文件。我已经下载了 Xcode 及其终端工具,所以这也不应该成为问题。

以下是错误:

testc4.c:4: error: expected identifier or ‘(’ before ‘)’ token
song.c:5: error: function definition declared ‘typedef’
song.c:5: error: return type is an incomplete type
song.c: In function ‘make_song’:
song.c:6: error: ‘Song’ undeclared (first use in this function)
song.c:6: error: (Each undeclared identifier is reported only once
song.c:6: error: for each function it appears in.)
song.c:6: error: expected ‘;’ before ‘newSong’
song.c:8: error: ‘newSong’ undeclared (first use in this function)
song.c:12: warning: ‘return’ with a value, in function returning void
song.c: At top level:
song.c:15: error: expected ‘)’ before ‘theSong’

这是我用来编译程序的命令:

gcc testc4.c song.c -o testc4

如果需要,我可以发布文件,但它们是直接从教程中复制而来的。我将我的测试文件命名为 testc4.c 而不是它想要的任何名称。

编辑:(我认为你需要编码)

testc4.c 文件:

#include <stdio.h>
#include "song.h"

main ()
{
  Song firstSong  = make_song (210, 2004);
  Song secondSong = make_song (256, 1992);

  Song thirdSong  = { 223, 1997 };
  display_song ( thirdSong );

  Song fourthSong = { 199, 2003 };
}

song.c 文件:

#include <stdio.h>
#include "song.h"

Song make_song (int seconds, int year)
{
  Song newSong;

  newSong.lengthInSeconds = seconds;
  newSong.yearRecorded    = year;
  display_song (newSong);

  return newSong;
}

void display_song (Song theSong)
{
  printf ("the song is %i seconds long ", theSong.lengthInSeconds);
  printf ("and was made in %i\n", theSong.yearRecorded);
}

song.h 文件

typedef struct {
  int lengthInSeconds;
  int yearRecorded;
} Song;

Song  make_song    (int seconds, int year);
void  display_song (Song theSong);

这些是直接从网站复制的。我先把它们打出来,但当它不起作用时,我复制并粘贴它们。

【问题讨论】:

  • 您可能想要粘贴您正在编译的内容。显然有问题。
  • 我们至少需要查看song.c 的第 1-15 行,以及您编写并包含在这些行中的任何标题。请参阅如何创建 SSCCE (Short, Self-Contained, Correct Example)。例如,如果您提供的代码重现了错误消息,我们就不需要 cmets。
  • 再次检查您是否使用 LF 作为换行符分隔符。这可能会给您带来问题。我试过了,这个命令行可以在我的 OS X gcc 4.2.1 上开箱即用地编译
  • gcc -std=c99 -Wall -g 编译并改进代码直到你没有收到警告!

标签: c gcc terminal


【解决方案1】:

也许你只需要改变:

main ()

void main ()

【讨论】:

  • main 应该返回 int。
  • 这是正确的。但是这个 main 什么也没返回。这是可以避免编译错误的最少修改。