在托管系统中,标准要求main
定义为“声明的类型为int
的返回类型”。这里的“声明”属于“推断出的返回类型”,因此我们可以为了这个问题而忽略该词。在C中,标准明确地有一个脚注,表示typedef
可以用于int
,但这在C ++标准中是缺失的。我将假设意图与语言是“返回类型int
”和“返回int
的函数的函数”相同,而typedef
只是一个别名,不是一个不同的类型。因此,该计划将被视为合法:
typedef int boobs;
boobs main() { }
如果我们这样做会怎么样?
#include <cstdint>
int32_t main() {}
在许多系统上,这将编译为int32_t
只是int
但不是所有系统。我的困惑源于int32_t
是一个实现定义的值,这意味着编译失败取决于实现。
那么这种情况的合法性是什么?整个程序是否格式不正确,因为它有时可以编译?或者它是否格式正确,因为它依赖于来自标准库的实现定义值?
答案 0 :(得分:4)
当且仅当int32_t
是int
的别名(typedef)时,程序才能很好地形成。
显然,在不支持int32_t
的系统中(固定宽度整数是可选的),使用未声明的int32_t
是非法的。
此外,即使编译器支持int32_t
,也不需要在标题<cstdint>
中的全局命名空间中声明它(仅保证std::int32_t
),因此程序依赖于实现的这一方面。
此外,在int32_t
是与int
不同的另一种类型的系统中,程序将会生成错误。
因此,无论程序是否形成良好,都是实现定义。在某些系统上它是;对别人来说不是。更简洁地说,该计划条件良好。