在托管系统中,标准要求 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/