繁体   English   中英

函数main在C和C ++中没有定义

[英]function main without definition in C and C++

为什么这段代码在C中编译成功并且会在C ++中出错?

int main;

它是否符合托管环境中的标准? 你能引用这个标准吗?

我用gcc测试过它。

为什么这段代码在C中编译成功并且会在C ++中出错?

因为C ++名称错误。 基本上,在所有实际实现中,链接器查找名为main符号 (或其变体,我在Apple的平台上看到_main ) - 在C中,可以是main()函数或名为 main 的extern存储变量 - 重点是通常C实现(编译器,工具链)不区分链接器级别的变量和函数,这就是为什么提供一个符号,无论是变量还是函数,名为main() 似乎都足够了 事实上,在托管环境中,根据标准,生成的程序(可执行文件)将不符合要求,因为在那里,需要实现main() 函数

在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。 该实现声明此函数没有原型。 一世

来自ISO / IEC 14882:1998(E) (又名C ++ 98), 3.6.1主要功能

实现不应预定义主函数。 此功能不应过载。 它应该具有int类型的返回类型,否则其类型是实现定义的。 所有实现都应允许以下两个main定义: int main() { /* ... */ }int main(int argc, char* argv[]) { /* ... */ }在后者中form argc应该是从运行程序的环境传递给程序的参数数量。 如果argc非零,则这些参数应在argv [0]中提供
argv [argc-1]作为指向以null结尾的多字节字符串(NTMBS)(17.3.2.1.3.2)和argv [0]的初始字符的指针,应该是指向NTMBS的初始字符的指针,该NTMBS表示用于的名称。调用程序或“”。 argc的值应为非负值。 argv [argc]的值应为0. [注意:建议在之后添加任何其他(可选)参数
argv的。 ]


函数main不得在程序中使用(3.2)。 main的链接(3.5)是3个实现定义的。 声明main为内联或静态的程序格式不正确。 名称main不以其他方式保留。 [示例:成员函数,类和枚举可以称为main,其他名称空间中的实体也可以称为main。 ]


int main; 不符合上述规定(“所有实施都应允许以下两个主要定义”,“在程序中不得使用功能主体(3.2)”)。

是的,它是有效的。

它声明了一个名为main的整数。

我想,我找到了一个。 这不是一个解决方案,但要记住如果你使用

gcc -Wall -Werror <file.c>

您将收到警告被视为错误:

main is usually a function name

因此最好使用-Wall进行编译,以便您也可以看到所有警告

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM