5

当我编译时真正发生了什么:

int main; 

它不应该是 main() 并导致错误吗?

我试图在 CodeBlocks 中编译代码,它编译得很好,没有错误。

4

2 回答 2

7

这不是错误,因为 C 源文件不需要具有main函数,并且您可以定义main为您想要的任何内容,只要您不尝试在同一范围内定义两次即可。因为这是您的整个程序,所以很好 - 但程序肯定不会正确运行,因为没有main可查找的功能。

它所做的只是声明一个名为 main 的全局(外部)变量,初始化为 0。如果它不存在,链接器通常会发出错误,但它可能会对外部变量的存在感到满意(我希望它假设它是一个指针) .

编辑:我用调试器稍微研究了一下,果然,main它的值为 0,即变量被用作没有强制转换的指针。因此,初始化代码尝试运行位于地址 0 的函数,导致我的平台出现段错误。

于 2013-03-09T11:41:33.447 回答
3

我认为由于范围不正确(或缺乏理解),您在这里感到困惑。

当您在这里说int main;编译器正在传递声明时,我假设您是在函数范围内声明它。但是,如果您尝试在全局范围内声明它,那么编译器将抛出重新定义错误。

因此,只要您在同一范围内没有两个相同的标识符,编译器就会满足并让您随心所欲。

下面的代码将给出重新定义错误:

int main;

int main()
{
  printf("In main\n");
}

下面的代码不会,因为 main 的范围仅限于函数内部,编译器认为int main变量和结果打印为 5。

int main()
{ 
   int main = 5;
   printf("In main, value of main is %d\n", main);
}

然而,下面的代码将打印 main 的地址

int main()
{
       printf("In main, value of main is %d\n", main);
}

编辑: 阅读评论后,我觉得这里的关键问题是你根本没有 main 函数,你应该有一个“C”程序开始工作。如果你没有 main 函数,只是声明一个int main;变量,你的代码可能仍然可以编译,但是当你执行时会出现混乱和混乱,因为 main 是一个整数变量,而它应该是一个函数。但是,只要您按照我上面的答案控制住您的主电源,您就应该做得很好。

你可以去这个链接,它解释了C程序的编译和执行的概念

于 2013-03-09T12:00:38.583 回答