编译非常简单的C程序时出错

时间:2015-12-30 21:34:48

标签: c linux gcc

我决定自学“C”并在教程网站上看到一个非常简单的“示例”程序,我想我会在学习的同时建立它。代码在

之下
/* hello.c*/
#include <stdio.h>
int main (int argc, char *argv[1]);
{
  if (argc > 1)
    printf("greetings %s.\n", argv[1]);
  else
    printf("Please tell me your name.\n");
  return 0;
}

我正在尝试使用以下命令进行编译

gcc -Wall -o hello_program hello.c

每当我尝试编译时,都会收到以下错误。

“hello.c:5:错误:预期标识符或'('''''''''''''''''''''

我一直在做一些谷歌搜索,并没有得到一个坚实的答案。我是100%新的C(Linux / Bash / Unix是我的世界)和编程语言。错误消息让我相信编译器在第5行失败,并且它想要'('在'{'之前,我似乎无法获得正确的顺序。感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

该行

int main (int argc, char *argv[1]);

应该是

int main (int argc, char *argv[])

(没有分号)。

还可以考虑在if语句中使用大括号。

答案 1 :(得分:2)

自从我使用C以来已经很长时间了,但我相信它应该是这样的:

/* hello.c*/
#include <stdio.h>
int main (int argc, char *argv[1])
{
  if (argc > 1){
    printf("greetings %s.\n", argv[1]);
}
  else{
    printf("Please tell me your name.\n");
}
  return 0;
}

答案 2 :(得分:2)

基本上在'C'中,每个语句或声明/定义都以分号结束(除非它是一些特殊的)。在全局空间(不在函数中)中,您只能声明/定义(声明声明某些类型的东西存在并命名它,而定义也指出它的内容)。

该行

int main (int argc, char *argv[1]);

简单地声明一个函数而不是定义它(你在下一行写的代码没有被计算,但它被解释为下一个声明/定义 - 它不是)。

因此,在您的情况下,分号必须在函数定义之后。像这样:

#include <stdio.h>
int main (int argc, char *argv[1])
{
  if (argc > 1)
    printf("greetings %s.\n", argv[1]);
  else
    printf("Please tell me your name.\n");
  return 0;
};

虽然如果你看一下标准,你会看到不需要最后一个分号。这是因为'C'对函数类型有特殊的容忍度。如您所见,函数'main'未使用等号('=')定义(与大多数其他类型一样),而是直接使用括号中的代码('{'[code]'}')。

另一件重要的事情是,所有数组/函数类型在函数中的处理方式都不同。在具有这种类型的参数的情况下,它被静默地“调整”为“指向”指针/“指向函数返回的指针”。并且在返回值的情况下 - 编译器错误(不允许这样的事情)。这意味着您的“主要”功能类型实际上是:

int (int, char **)

我建议你不要欺骗你的代码阅读器并实际编写实际的函数类型。

我并不认为我的描述是1:1的标准或任何东西 - 我只是解释我看到的东西。

出于某种原因,即使使用最后一个分号也不成问题。我想这是可能的,因为在'C'中你也可以有那些空语句(就像你只有终止分号一样)。