【问题标题】:In C, can a function called Main() be created?在 C 中,可以创建一个名为 Main() 的函数吗?
【发布时间】:2016-08-28 19:12:08
【问题描述】:

可以在 C 中创建名为 Main() 且大写为 M 的函数吗?
由于两个同名但大小写不同的元素被视为单独的实体,我认为可以创建Main(),但我只需要确认。

【问题讨论】:

  • 你为什么不试试呢?
  • 我会选择maiN()
  • 嗯,这是 C 的期中测试!
  • 我遇到过可以做到这一点的 C 代码。

标签: c main case-sensitive uppercase


【解决方案1】:

当然,为什么不呢?预处理器和编译器并不关心"Main""main" 是否基本相似。 C 区分大小写,因此"Main""main" 是两个完全不同的名称。 (它可能无助于可读性,但没有技术原因你不能)例如,

#include <stdio.h>

int Main (int argc, char **argv)
{
    for (int i = 1; i < argc; i++)
        printf (" %2d : %s\n", i, argv[i]);

    return argc;
}

int main (int argc, char **argv) {

    printf ("\n %d arguments.\n", Main (argc, argv) - 1);

    return 0;
}

使用/输出示例

$ ./bin/mainMain The quick brown fox jumps over a lazy dog.
  1 : The
  2 : quick
  3 : brown
  4 : fox
  5 : jumps
  6 : over
  7 : a
  8 : lazy
  9 : dog.

 9 arguments.

【讨论】:

    【解决方案2】:
    int Main (void)
    {
       return 0;
    }
    
    int main (void)
    {
       return 0;
    }
    

    完美地编译和链接。它区分大小写。

    【讨论】:

    • 谢谢!我还是个初学者;你是什​​么意思'它链接很好'?两个函数都在同一个文件中,不是吗?抱歉,这是一个非常愚蠢的问题。
    • 是的,这两个函数在同一个文件中。您拥有将源代码转换为目标代码的编译器。链接器将它们放在一起以具有可执行文件。如果您有多个文件,它会将它们链接在一起,并且还会与系统的一些库(例如,对于 IO,...)。如果您尝试创建可执行文件,则根据您的环境,这两个步骤都会自动完成。
    • 还有一点要说:如果你创建第二个文件并将非标准的Main放入其中,那么链接器会给你带来一个错误“Multiple definition of Main”。只是为了看到链接器在做他的工作。这不是您的问题的一部分。
    【解决方案3】:

    这是一个糟糕的主意,一些不严格遵守的环境可能会保留该名称。但是链接器应该区分大小写,并且不保留带有大写字母的 Main。

    【讨论】:

    • 您的意思是非细致的环境可能会将 Main() 保留为 main() 而不会区分两者?
    • 就像 Visual Studio 保留 WinMain 一样,至少在某些模式下如此。如果编译器需要一个与 main() 特性略有不同的备用条目,那么 Main 是一个明显的标识符选择。
    【解决方案4】:

    你已经得到了答案,只是补充一点权威的引用,直接来自C11,第 5.1.2 章

    执行环境:

    定义了两种执行环境:独立和托管。在这两种情况下, 当执行调用指定的 C 函数时,程序启动发生 环境。 [...]

    然后,§5.1.2.2,托管环境,p1,“程序启动”

    程序启动时调用的函数名为main。 [...]

    也就是说,正如我们所知,C 是区分大小写的,(引用 §6.4.2.1/2,“标识符”,常规)

    标识符是一系列非数字字符(包括下划线 _、 小写和大写拉丁字母和其他字符)和数字,指定 6.2.1 中描述的一个或多个实体。 小写和大写字母不同。 [....]

    因此,与main() 没有相同大小写的标识符与main(),无论是Main()MAIN()maiN() 还是任何其他可能的组合,都是不同。就 C 而言,它们都是不同的标识符。

    所以,答案

    在 C 中,可以创建一个名为 Main() 的函数吗?

    是的,当然。

    为了更清楚一点,如果你创建Main()并忽略main(),编译器本身将无法知道你的意思是main()Main(),因为它们是编译器的不同标识符。

    【讨论】:

    • ".. 正如我们已经知道的 .." – 无需参考 Wikipedia,因为它在 6.4.2.1 中特别提到:“小写和大写字母是不同的。” :)
    • @RadLexus 那么,让我把那个 wiki 改成标准引用.. :)
    • 方式比“为什么不”更好:D
    【解决方案5】:

    只有当你用大写字母写一个或多个字母时,我认为,就像 Main 或 MAIN 一样,否则你的编译器将无法判断你想要哪个 main,因为 main 已经是 C 中的一个函数。 注意:我也是初学者,所以我很可能是错的。

    【讨论】:

      猜你喜欢
      • 2019-12-12
      • 1970-01-01
      • 2020-03-17
      • 2021-06-07
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      相关资源
      最近更新 更多