typedef-基元类型到基元类型 对于原始类型到另一个基元类型,有效的C++是否有一个Type? typedef int long;

typedef-基元类型到基元类型 对于原始类型到另一个基元类型,有效的C++是否有一个Type? typedef int long;,c++,visual-studio-2012,typedef,language-lawyer,gcc4,C++,Visual Studio 2012,Typedef,Language Lawyer,Gcc4,在VS 2012上,发布了警告,但汇编结果良好 警告C4091:“typedef”:未声明变量时忽略“long”左侧的 但在gcc-4.3.4中,它失败了 错误:声明没有声明任何内容 哪个编译器符合标准 PS:我不会在生产代码中写这样的东西。刚刚想到了这个想法并进行了检查。他们说的都是同一件事,但有一个人报告说这是一个错误。请注意,VS警告说“typedef被忽略”。问题是int long和long int是同义词,因此您基本上是在创建一个未命名的typedef到long,它们都在说相同的话,但

在VS 2012上,发布了警告,但汇编结果良好

警告C4091:“typedef”:未声明变量时忽略“long”左侧的

但在gcc-4.3.4中,它失败了

错误:声明没有声明任何内容

哪个编译器符合标准


PS:我不会在生产代码中写这样的东西。刚刚想到了这个想法并进行了检查。

他们说的都是同一件事,但有一个人报告说这是一个错误。请注意,VS警告说“typedef被忽略”。问题是
int long
long int
是同义词,因此您基本上是在创建一个未命名的
typedef
long

,它们都在说相同的话,但有一个报告为错误。请注意,VS警告说“typedef被忽略了”。问题是
int long
long int
是同义词,因此基本上您正在创建一个未命名的
typedef
long

有效吗++

编号C++11,§7.1.3.6:

在给定范围内,typedef规范不得用于重新定义该范围内声明的任何类型的名称,以引用不同类型

有效吗++

编号C++11,§7.1.3.6:

在给定范围内,typedef规范不得用于重新定义该范围内声明的任何类型的名称,以引用不同类型


两者都符合标准要求。该typedef无效,两个编译器都发出诊断。

都执行标准要求的操作。typedef无效,两个编译器都会发出诊断。

不确定,但这对我来说似乎是个可怕的想法。第一个问题是您已经确定的问题。除此之外,任何来到您的项目的新程序员都可能会被代码愚弄。如果代码需要移植到一个系统中,int表示不同的意思(例如,更大),会发生什么呢?@JonathanWood我理解,但只是检查这里的语言规则。我不会写这样的东西。不确定,但这对我来说似乎是个可怕的想法。第一个问题是您已经确定的问题。除此之外,任何来到您的项目的新程序员都可能会被代码愚弄。如果代码需要移植到一个系统中,int表示不同的意思(例如,更大),会发生什么呢?@JonathanWood我理解,但只是检查这里的语言规则。我不会写这样的东西,我相信它是有效的C++。它不是解析为
int
long
的typedef,而是解析为
int long
的typedef(与
long int
相同,或者只是
long
),指定不给类型命名。如果示例为例如
typedef int char,则该示例无效相反。虽然由于您引用的原因,OP试图完成的工作不可能完成,但还应注意,这不是收到错误/警告的原因。错误/警告是因为“int long”被解释为单一类型,因此typedef无效。VC++在这种情况下发出警告并继续运行。GCC更为严格。哪一个更正确——谁知道呢。这可能是留给编译器的一个实现细节。@Cat Plus加上为什么不能这样解释规则()?@SeanCline-Re哪个更正确-两者都是。该标准仅要求,如果程序违反了任何可诊断规则,则一致性实现必须发出至少一条诊断消息。除此之外,实现所做的事情取决于实现。它可能就停在那里;忽视问题,继续;以某种方式了解程序员的想法,解决问题,然后继续;大多数编译器都会尝试读心术,以便一次捕获多个错误。(当检测到错误时,它们也倾向于跳过创建可执行文件。)@Angew:它仍然无效,因为
typedef
必须声明类型名称。C++ 11, 7/C++ 3:“在一个简单的声明中,可选的init声明器列表只能在声明类或枚举时被省略”(init声明器列表是包含声明的标识符的部分)。它不是解析为
int
long
的typedef,而是解析为
int long
的typedef(与
long int
相同,或者只是
long
),指定不给类型命名。如果示例为例如
typedef int char,则该示例无效相反。虽然由于您引用的原因,OP试图完成的工作不可能完成,但还应注意,这不是收到错误/警告的原因。错误/警告是因为“int long”被解释为单一类型,因此typedef无效。VC++在这种情况下发出警告并继续运行。GCC更为严格。哪一个更正确——谁知道呢。这可能是留给编译器的一个实现细节。@Cat Plus加上为什么不能这样解释规则()?@SeanCline-Re哪个更正确-两者都是。该标准仅要求,如果程序违反了任何可诊断规则,则一致性实现必须发出至少一条诊断消息。除此之外,实现所做的事情取决于实现。它可能就停在那里;忽视问题,继续;以某种方式了解程序员的想法,解决问题,然后继续;大多数编译器都会尝试读心术,以便一次捕获多个错误。(当检测到错误时,它们也倾向于跳过创建可执行文件。)@Angew:它仍然无效,因为
typedef
必须声明类型名称。C++11,7/3:“在简单声明中,只有在声明类或枚举时,才可以省略可选的init声明器列表”(init声明器