c++ - 这个 `main` 的定义有多合法?

标签 c++ language-lawyer program-entry-point

在托管系统中,标准要求 main 定义为“声明的 int 类型的返回类型”。这里的“声明”属于“推导的返回类型”,因此我们可以出于这个问题的目的忽略该词。在 C 中,该标准明确有一个脚注,说明 typedef 可用于 int,但这在 C++ 标准中缺失。我将假设意图与语言相同,即“int 类型的返回类型”和“() 返回 int 的函数”和 typedef 只是一个别名,而不是不同的类型。因此这个程序将被认为是合法的:

typedef int boobs;
boobs main() { }

如果我们改为这样做呢?

#include <cstdint>

int32_t main() {}

在许多系统上,这将编译为 int32_t 只是 int 但不是所有系统。我的困惑源于 int32_t 是一个实现定义的值,这意味着编译失败取决于实现。

那么这种情况的合法性如何呢?整个程序是否格式错误,因为它有时可以编译或不编译?或者它的格式是否正确,因为它取决于来自标准库的实现定义的值?

最佳答案

当且仅当int32_t 程序是良构的是 int 的别名(typedef) .

显然,在不支持 int32_t 的系统中(固定宽度的整数是可选的),使用未声明的int32_t是非法的。

此外,即使 int32_t编译器支持,不需要在头文件<cstdint>的全局命名空间中声明(只有 std::int32_t 是有保证的),因此该程序依赖于该方面的实现。

此外,在系统中 int32_t是不同于 int 的另一种类型,程序将是病态的。

所以,它是由实现定义的,程序是否格式正确。在某些系统上是;在其他人身上则不然。更简洁地说,该程序是有条件地良构的。

关于c++ - 这个 `main` 的定义有多合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36875583/

相关文章:

c++ - Platform C 预处理器定义

c++ - typedef 名称可以用于声明或定义构造函数吗?

c - C中的多个文件编译错误

java - 我将如何创建一个将数组添加到数组列表并调用它们的方法的 main 方法?

c++ - 从两个不同的数据结构将数据插入 std::map <std::string, int> mymap 并通过套接字发送

c++ - 有没有办法简单地连接多个 vector ?

c++ - 试图理解 C++ 标准中的 [class.qual]/2

c++ - 如果表达式的求值需要对引用求值,为什么表达式不是 "core constant expression"?

java - 在主方法中调用类的构造函数?

c++ - 在 C++ 中使用有符号变量和无符号变量作为标志