在托管系统中,标准要求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
的类型,程序将形成不良。
因此,无论程序是否格式良好,它都是实现定义的。在某些系统上是这样;在其他人身上则不是。更简洁地说,该程序有条件地格式良好。