这个“主要”的定义有多合法?

时间:2016-04-26 20:56:36

标签: c++ language-lawyer main

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

typedef int boobs;
boobs main() { }

如果我们这样做会怎么样?

#include <cstdint>

int32_t main() {}

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

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

1 个答案:

答案 0 :(得分:4)

当且仅当int32_tint的别名(typedef)时,程序才能很好地形成。

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

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

此外,在int32_t是与int不同的另一种类型的系统中,程序将会生成错误。

因此,无论程序是否形成良好,都是实现定义。在某些系统上它是;对别人来说不是。更简洁地说,该计划条件良好。