C ++ Semicolon课后,struct,enum,......没用但编译器仍会发出错误?

时间:2011-10-08 18:53:16

标签: c++ compiler-construction

  

可能重复:
  In C++ classes, why the semi-colon after the closing brace

这是我一直想知道的事情,为什么你必须在c ++的类,结构或枚举的结束括号后加一个分号?

更糟糕(或实际问题),为什么编译器在发出警告时会发出错误?

将分号放在那里是否真的很重要,为什么?

4 个答案:

答案 0 :(得分:10)

这是C的遗留问题。您可以在cladd / struct / enum声明之后声明变量。代码:

class A{};
A a;

与:

相同
class A{} a;

编译器需要;知道你不想在类声明后声明变量。

答案 1 :(得分:8)

  

将分号放在那里是否真的很重要,为什么?

是。这可能有用。

您可以定义结构,并可以将对象声明为:

struct A
{
  //members
} obj;

objA类型的对象,您如上所示声明了这一点。在声明变量之后,以相同的方式放置分号,例如:

int i;                      //declares i of type int
std::string s;              //declares s of type std::string
struct {int x,y,z;} point;  //declares point of an unnamed struct type  

这里前两个声明看起来非常熟悉,但最后一个看起来有点陌生,因为它定义了一个未命名的结构,同时声明了一个名为point的未命名结构的对象。

最重要的是,无论你如何声明对象,无论它们的类型是什么,都要在统一声明对象后放置分号。

不仅如此,你甚至可以统一typedef

 typedef int my_int;
 typedef std::string my_string;
 typedef struct {int x,y,z;} my_point;

现在所有这些my_intmy_stringmy_point都是类型。

但是如果你们两个都没有(即既没有声明对象,也没有定义typedef),那么你只需要留下这个空白,没有任何声明/定义。但值得注意的是,它一直为您提供有趣且实用的功能。

答案 2 :(得分:3)

类,结构和枚举定义是定义。 C ++中的定义,如在C中,必须用分号完成。 如果你不把它放在那里会有很多含糊之处:

struct X
{
}   //no ;
foo()  //no return value
{
}

这被读作函数foo,它返回一个结构,而不是一个结构和一个返回(ommited)整数的函数。这是有效的C,但不是C ++。

int *x;
void foo()
{
    struct S { }  //no ;
    *x = 3;  // <--- what is this?
}

第二个xpointer-to-S类型的局部变量,还是对全局x的引用?你根本说不出来。

如果你尝试的话,还有很多其他的例子,可能你会想到一些。

答案 3 :(得分:2)

  

为什么你必须在c ++的类,结构或枚举的结束括号后放置一个半冒号?

真实答案,因为C ++标准是这样说的。该语言的设计方式使每个声明必须以;结束。

类对象可以声明为:

class MyClass
{
    //Members    
}obj;

因此大括号末尾的;

  

更糟糕(或实际问题),为什么编译器在发出警告时会发出错误?

编译器在怀疑可能存在错误或潜在危险时会发出警告

当程序不遵循标准规定的语法指南时,编译器会发出错误,在您提到的情况下忽略了半冒号,违反了C ++标准提到的语法规则,从而导致错误。