【问题标题】:How to compile and run `main;` in C如何在 C 中编译和运行`main;`
【发布时间】:2021-02-08 18:10:30
【问题描述】:
main;

这是可以用 C 编译的最小程序。 编译警告(gcc):

test.c:1:1: warning: type defaults to ‘int’ in declaration of ‘main’ [-Wimplicit-int]
test.c:1:1: warning: ‘main’ is usually a function [-Wmain]

我想从句法上理解它的含义,即:

  • 为什么在声明函数时使用分号?
  • 为什么缺少括号和大括号是合法的?

我知道函数的默认返回类型是int,如果省略的话。我还听说过在main 之前调用的_start 函数。这意味着它正在调用一个尚未定义的函数(?)。

为什么可执行文件在运行时会出现段错误?

【问题讨论】:

  • 警告很清楚易懂,有一些规则我们需要遵守。可能任何专家都可以解释为什么部分。
  • 你的minimal reproducible example在哪里?您的问题中没有可以编译和运行的内容。
  • 顺便说一句:警告type defaults to ‘int’ .... 或任何包含单词implicit 的警告应始终被视为错误。
  • 这个问题被低估了。仅由 main; 组成的 C“程序”被 all the major compilers 接受这一事实令人难以置信,事实上您可以在顶层编写 myvar;并且默认为int

标签: c compilation main


【解决方案1】:

因为您没有为main 指定类型,所以编译器默认为int 类型。不是返回int 的函数,而是返回int。从句法的角度来看,这是合法的,因为您的代码中也可以有 myvar;,它也将被声明为 int

但是因为main 是特殊的,所以你会收到第二个警告。它让您知道您定义 main 的方式与通常定义的方式不同。

所以当你编译这个程序并尝试运行它时,它期望main 是一个函数的开始,而实际上它只是一个int 变量。这就是导致段错误的原因。

【讨论】:

    猜你喜欢
    • 2017-07-08
    • 2015-06-26
    • 2014-08-05
    • 1970-01-01
    • 2023-03-18
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多