2010-08-25 60 views
1

Visual Studio 2008没有捕捉到语法错误。例如:Tpc_feed(void);编译正常。 这个:Tpc_feed(void);;;;;;;编译正常,但是这个Tpc_feed(void)发现错误。额外的分号不是语法错误吗?我在Windows 7 32位和VS C++ 2008Visual Studio 2008没有捕捉到语法错误

+0

语法规则需要分号。连续的分号意味着空白的代码行,编译器会忽略这些代码行 – Rahul 2010-08-25 18:17:28

回答

7

从技术上讲,这是一个语法错误,但大多数编译器都允许它。除非您使用-pedantic进行编译,否则GCC甚至会默认它。

无论如何,这是违反标准,所以你应该摆脱额外。

+0

我知道我应该删除它们,但为什么编译器允许它? – TheFuzz 2010-08-25 18:07:01

+1

谁知道?编译器并不完美。 (1)对正确的程序没有影响,(2)很容易猜测编码者打字时的意图是什么。 – zildjohn01 2010-08-25 18:22:18

1

没有返回类型,它们都不应该编译为C++。假设添加了返回类型,则在成员函数声明中允许使用额外的分号,但如果声明位于类/结构之外,则它们将被禁止。

我不相信VC++有一个标志强制他们被标记为错误。

编辑:其实(回去和重新检查的东西),不必要的分号允许以下成员函数定义,但我认为你是对的,这是不允许以下成员函数声明

+0

它的我的类构造函数,所以不编译为C++? – TheFuzz 2010-08-25 18:20:45

+0

噢,好的 - 是的,ctor不需要(并且实际上不能)指定返回类型。我很抱歉。 – 2010-08-25 18:43:08

0

正如其他人已经说过,这不是一个有效的C++。为什么许多编译器支持也无妨的原因是,它使创建的宏更容易一点/更直观,可以这样考虑:

// Declares a function, and because the semicolon belongs to the declaration, the macro adds it 
#define MY_FUNCTION_DECL(returnType, arguments) returnType myFunction arguments; 

// Calling macros looks like functions, the semicolon looks natural 
MY_FUNCTION_DECL(void, (int, int, int)); // There are two semicolons now 

这个例子有点怪异,因为我和好了,但现在它应该背后代表的想法接受更多分号作为有效。