【问题标题】:C identifier and main [closed]C标识符和主要[关闭]
【发布时间】:2018-05-24 10:23:33
【问题描述】:

1.为什么"main"在C main()函数标识符中? 2.如果main是一个标识符,那么程序如何只从ma​​in开始执行。

【问题讨论】:

  • 对不起,什么?
  • 说标识符是什么意思?关键词? main 没有关键字,
  • “正如我们所知,编译器对标识符一无所知” 我想你可能在混用别的东西。编译器(或工具链的其他部分)确实知道标识符 main 具有特殊含义。
  • @SouravGhosh:“标识符”在 C 2011 [N1570] 6.4.2 中定义:“标识符是一系列非数字字符(包括下划线 _、小写和大写拉丁字母以及其他字符)和数字,它们指定一个或多个实体,如 6.2.1 所述。”

标签: c


【解决方案1】:

main 是一个函数,几乎和其他函数一样。它由一个标识符命名,它被调用,它接收一些参数,它做一些事情,它返回一个值。这几乎就是函数的定义。 C 的设计者追求简单,因此将程序的入口点设置为普通函数是完全合理的。

如果您是一名汇编语言程序员,您可能知道程序的入口点只是一个地址,而不是一个成熟的函数。但那是汇编语言的说法:C 是一种高级语言。

正如其他人所解释的那样,某处有一些低级启动代码(通常用汇编程序编写),它具有程序的实际入口点,当您的程序启动时跳转到。该启动代码是实际调用您的main 函数的代码。

我说main是一个普通函数,而且大部分是,但它具有其他函数不具有的三个特殊属性:

  1. 这只是您编写的唯一一个您无法选择自己的名称、返回值和参数类型的函数——这些都是为您选择的(或者,如果您想这种方式,强迫你)由语言。例如,返回类型必须int,因为语言是这样说的。你不能仅仅因为你想把它变成其他类型(尽管当然有很多程序员把它做成void,并且经常侥幸逃脱)。

  2. main 实际上有两组可以接受的有效参数:零个或两个,即intchar **(传统上称为argcargv)。

  3. 作为一个非常的特殊例外,即使main返回int,你也可以没有return语句,编译器基本上会插入一个你,让main()默认返回0。

【讨论】:

    【解决方案2】:

    C 标准将main 函数定义为程序入口点。它从启动代码或程序加载器中调用。

    顺便说一句,您可以更改它(我不知道为什么,但如果您愿意,可以) - 以裸机 ARM 为例

    启动:

    /* Call the clock system intitialization function.*/
        bl  SystemInit
    /* Call static constructors */
        bl __libc_init_array
    /* Call the application's entry point.*/
        bl  initCCMRAM
    /* Here was the main call */
        bl  my_entry_point_function 
    
    LoopForever:
        b LoopForever
    

    在 C 代码中

    int my_entry_point_function(void)
    {
    ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-07
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多