CAN总线的签名在C ++中有签名和const修饰词的争论? [重复](Can the argu

2019-09-01 02:57发布

这个问题已经在这里有一个答案:

  • 又该C和C ++的main()的回报? 18个回答

该标准明确规定, main有两个有效(即,保证工作)的签名; 即:

int main();
int main(int, char*[]);

我的问题很简单,会像下面是合法的吗?

int main(const unsigned int, const char* const* argv);

我的测试中说“是”,但我不能确定的答案,因为我不能超载main通过改变intunsigned int以及非顶级const的argv -ness? 如果我是,那么这就是明确禁止。

那么,这些修改保证在符合标准的编译一个标准的制定工作?

Answer 1:

在C ++ 98标准说,在节3.6.1第2段

一个实现不应预先定义的主要功能。 此功能不得超载。 它应该是一个类型的返回类型int ,但除此之外,它的类型是实现定义的。 所有的实现应允许以下两种定义mainint main()int main(int argc, char* argv[])

因此,它不是由标准规定的ENV接受main是可以接受的,但它是允许的。


因为这个被称为时候,这里是前一段从什么,但记录他们的行为豁免独立的环境:

计划须含有一种被称为全球主要的功能,这是该计划的指定的开始。 它是定义在独立环境中的程序是否需要定义一个主要功能的实现。 [注:在独立环境,启动和终止定义实施; 启动包含构造为具有静态存储持续时间的命名空间范围的对象的执行; 终止包含析构函数与静态存储持续时间的对象执行。 ]



Answer 2:

您必须使用符合标准的特征之一是符合标准的。

我完全理解为什么你想要做你的方式。 最好的办法是写自己的功能myMain()或任何你想要的签名,并从主称之为(),包括所需的转换。



Answer 3:

argv指针不应该const char* const ,因为该计划允许改变缓冲区。



Answer 4:

至于我可以看到从阅读标准,你是不符合标准的。 但我不能想象一个编译器,它不会让你这样做。 如,它会采取更多的工作,从编译器明确禁止的边缘情况主要是无害的,非常模糊。



Answer 5:

如果编译器使用名字改编为这可能不起作用main 。 这毕竟是一个C ++函数。 因此,链接器将寻找两个特殊“manglings”。 你的定义还会有一个重整名称。

请注意, main是特殊的(不超载,不赎回),并可能不需要名字改编的。



Answer 6:

你可能是非法的标准,但大多数运行时并不真正关心。 他们会只是推动一个整数argc和指针argv ,打电话给你的main ,希望你解析他们的权利。 所以,在你的职权范围内,“保证工作”为装载机真的不关心你声明什么论据,是值得商榷的。

如果它建立, main将被调用。 你如何解析参数是由你。 我要澄清,这是非常具体的平台,因为几乎是这整个问题。

这就是说, 为什么呢?



Answer 7:

ISO / IEC 9899:TC3

第5.1.2.2.1计划启动

所谓在程序启动的功能被命名为主力。 实施声明没有原型实现此功能。 它应为int的和不带参数的返回类型进行定义:

int main(void) { /* ... */ }

或具有两个参数(此处称为argc和argv,虽然任何名称可以被使用,因为它们是本地的,其中声明它们的功能):

int main(int argc, char *argv[]) { /* ... */ }

或等同物; 9)或在一些其它实现定义的方式。



文章来源: Can the arguments of main's signature in C++ have the unsigned and const qualifiers? [duplicate]