C++ “main”的这个定义有多合法?

C++ “main”的这个定义有多合法?,c++,language-lawyer,main,C++,Language Lawyer,Main,在托管系统中,标准要求使用“声明的返回类型int”定义main。这里的“声明”属于“推断的返回类型”,所以我们可以忽略这个词。在C中,标准明确地有一个脚注,说明可以用于 int >代码>,但是在C++标准中缺少了。我将假设其意图与语言“返回类型int”和“返回int的()函数”相同,typedef只是一个别名,而不是不同的类型。因此,该计划将被视为合法: typedef int boobs; boobs main() { } 如果我们这样做呢 #include <cstdint>

在托管系统中,标准要求使用“声明的返回类型
int
”定义
main
。这里的“声明”属于“推断的返回类型”,所以我们可以忽略这个词。在C中,标准明确地有一个脚注,说明<<代码> TyPulf< /Cord>可以用于<代码> int >代码>,但是在C++标准中缺少了。我将假设其意图与语言“返回类型
int
”和“返回
int
的()函数”相同,
typedef
只是一个别名,而不是不同的类型。因此,该计划将被视为合法:

typedef int boobs;
boobs main() { }
如果我们这样做呢

#include <cstdint>

int32_t main() {}
#包括
int32_t main(){}

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


那么这种情况的合法性是什么?整个程序是否因为有时可以编译而格式不正确?或者它是格式良好的,因为它依赖于来自标准库的实现定义的值吗?

当且仅当
int32\t
int
的别名(typedef)时,程序是格式良好的

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

此外,即使编译器支持
int32_t
,也不需要在头
的全局命名空间中声明它(只保证
std::int32_t
),因此程序依赖于实现的这一方面

此外,在
int32\t
是与
int
不同的另一种类型的系统中,程序的格式将不正确


因此,无论程序的格式是否良好,它都是实现定义的。在某些系统上是这样的;在其他人身上则不然。更简单地说,程序是有条件的格式良好。

当且仅当
int32\u t
int
的别名(typedef)时,程序才是格式良好的

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

此外,即使编译器支持
int32_t
,也不需要在头
的全局命名空间中声明它(只保证
std::int32_t
),因此程序依赖于实现的这一方面

此外,在
int32\t
是与
int
不同的另一种类型的系统中,程序的格式将不正确


因此,无论程序的格式是否良好,它都是实现定义的。在某些系统上是这样的;在其他人身上则不然。更简单地说,这个程序是有条件的格式良好。

所以我们可以忽略这个词的
-把我排除在外这有什么用?我的意思是,如果它只在
int32\u t
只是
int
的情况下工作,那么你最好首先使用
int
“编译失败取决于实现”——是的,这可能会发生,这没什么不寻常的,你可能会问
\ifdef\uu供应商
/
,我讨厌的错误(供应商)
/
#endif
使用非(供应商)编译器编译。如果标准中有任何措辞要求它在所有实现中都是错误的,那么这肯定是标准中的缺陷。但是,这并不能回答这个问题:理论上可能存在这样的缺陷。在重新阅读你的帖子后:关于这是否是格式错误/格式正确的问题可以从两个方面来理解,而我只是从一个特定的角度来理解,这可能不是你想要的。你是在问实现是否可能/必须诊断这一点,还是在问条件错误代码的正确术语是什么?
,因此我们可以忽略该词的
-不必问我这有什么用?我的意思是,如果它只在
int32\u t
只是
int
的情况下工作,那么你最好首先使用
int
“编译失败取决于实现”——是的,这可能会发生,这没什么不寻常的,你可能会问
\ifdef\uu供应商
/
,我讨厌的错误(供应商)
/
#endif
使用非(供应商)编译器编译。如果标准中有任何措辞要求它在所有实现中都是错误的,那么这肯定是标准中的缺陷。但是,这并不能回答这个问题:理论上可能存在这样的缺陷。在重新阅读你的帖子后:关于这是否是格式错误/格式正确的问题可以从两个方面来理解,而我只是从一个特定的角度来理解,这可能不是你想要的。您是在问实现是否可能/必须诊断此问题,还是在问条件错误代码的正确术语是什么?