为什么这段代码在C中编译成功并且会在C ++中出错?
int main;
在托管环境中是否符合标准?你能引用这个标准吗?
我用gcc测试了它。
答案 0 :(得分:9)
为什么这段代码在C中编译成功并且会在C ++中出错?
因为C ++名称错误。基本上,在所有实际实现中,链接器会查找名为main
的符号(或其变体,我在Apple的平台上看到_main
) - 在C中,可以是main()
函数或名为 main
的外部存储变量 - 重点是通常C实现(编译器,工具链)不区分变量和函数at链接器级别,这就是为什么提供一个符号,无论是变量还是函数,名为main()
似乎都足够。实际上,在托管环境中,根据标准,生成的程序(可执行文件)将不符合要求,因为在那里,需要实现main()
功能。 / p>
在C ++中,通常使用名称修改(为了实现C ++的功能,例如函数重载),这意味着编译器根据类型对可执行文件中的结果符号进行不同的命名,如果是的话函数,变量,具有不同签名的函数和其他情况。因此,链接器基本上找不到与预期的int main(int, char *[])
函数对应的符号,并将发出错误消息。
符合标准吗?
没有定义main()
函数(参见第一部分)。据我所知,拥有一个名为main
的变量以及main函数是有效的C ++,但它肯定是不好的做法。
你能引用标准吗?
是的(请强调我的):
C ++ 98,第3.6.1段:
程序应包含一个名为
main()
的全局函数,它是程序的指定开始。 实现定义是否需要独立环境中的程序来定义main()
函数。C99,第5.1.2.2.1段
5.1.2.2.1程序启动
1程序启动时调用的函数名为main。实施宣布否 这个功能的原型。我
答案 1 :(得分:4)
从ISO/IEC 14882:1998(E)(又名C ++ 98), 3.6.1主要功能:
实现不应预定义主函数。这个 功能不得超载。它的2应具有返回类型 输入int,但其类型是实现定义的。所有 实现应允许以下两个定义 主要:
int main() { /* ... */ }
和int main(int argc, char* argv[]) { /* ... */ }
在后一种形式中,argc应该是传递给它的参数的数量 来自运行程序的环境的程序。如果argc是 非零这些参数应在argv [0]到
中提供 argv [argc-1]作为指向null终止的初始字符的指针 多字节字符串(NTMBS)(17.3.2.1.3.2)和argv [0]应为 指向表示名称的NTMBS的初始字符的指针 用来调用程序或“”。 argc的值应为 非负。 argv [argc]的值应为0. [注意:它是 建议在执行后添加任何其他(可选)参数 argv的。 ]
在程序中不得使用函数main(3.2)。该 main的链接(3.5)是3个实现定义的。一个程序 声明main为inline或static是不正确的。主要名称是 没有其他保留。 [示例:成员函数,类和 枚举可以称为main,也可以称为其他实体 命名空间。 ]
int main;
不符合上述要求(“所有实现都应允许以下两个主要定义”,“函数main不得在程序中使用(3.2)”。
答案 2 :(得分:1)
是的,这是有效的。
它声明了一个名为main
的整数。
答案 3 :(得分:1)
我想,我找到了一个。这不是一个解决方案,而是要记住 如果你使用
gcc -Wall -Werror <file.c>
您将收到警告被视为错误:
main is usually a function name
因此最好使用-Wall
进行编译,以便您也可以看到所有警告