C++ 当struct关键字在函数中使用变量声明时,编译器为什么不抱怨呢?

C++ 当struct关键字在函数中使用变量声明时,编译器为什么不抱怨呢?,c++,struct,C++,Struct,对于这个模糊的问题,我很抱歉,我不确定在简洁的同时如何具体。我在查看同事的代码时注意到以下行为,我不明白为什么编译器(GCC4.8.2)没有抱怨。以下是一个简单的例子: #include <iostream> using namespace std; struct mystruct { int val; }; int main() { struct mystruct x; //What is the compiler doing here? /* Do somet

对于这个模糊的问题,我很抱歉,我不确定在简洁的同时如何具体。我在查看同事的代码时注意到以下行为,我不明白为什么编译器(GCC4.8.2)没有抱怨。以下是一个简单的例子:

#include <iostream>

using namespace std;

struct mystruct {
  int val;
};

int main()
{
  struct mystruct x; //What is the compiler doing here?

  /* Do something with x here */
  return(0);
}
#包括
使用名称空间std;
结构mystruct{
int-val;
};
int main()
{
struct mystruct x;//编译器在这里做什么?
/*在这里用x做点什么*/
返回(0);
}
编译器如何处理行
struct mystruct x?如果它将其视为一个名为
mystruct
的局部结构的声明和名为
x
的实例的初始化,为什么允许我将
x
视为全局范围中定义的
mystruct
的实例


我的另一个想法是,它可能像一个向前声明,但我不知道可以在进行向前声明的同时声明一个类的实例。这就是这里发生的事情吗(实际上它除了声明变量之外什么都不做,因为已经定义了
mystruct

编译器不会抱怨,因为代码没有问题。你所做的正是你所描述的。您已将
x
定义为
mystruct
类型的变量


您可能不熟悉这种形式,但在C中,它是声明变量具有
struct
类型的唯一方法。在C++中,它不太常见,因为在这个上下文中,<代码>结构> <代码>关键字是可选的;但是,C++与传统的C语法保持兼容性。

< P>编译器不会抱怨,因为代码没有错误。你所做的正是你所描述的。您已将
x
定义为
mystruct
类型的变量


您可能不熟悉这种形式,但在C中,它是声明变量具有
struct
类型的唯一方法。在C++中,它不太常见,因为在这个上下文中,<代码>结构> <代码>关键字是可选的;但是,C++与传统的C语法保持兼容性。

< P> >代码> C>代码>语法,对于<代码> C++ >代码> >

有效。 在
c
中,如果希望在声明中删除
struct
关键字,则需要使用
typedef

事实上,如果您声明
typedef
'd和untypedef'd名称,您可以使用任一语法进行初始化

e、 g

对于
c++
而言,在声明
struct
时不需要使用
typedef
,因此在声明实例时使用
struct
是可选的,主要是出于遗留原因


如果您发现自己使用的是跨C/C++代码库,那么了解两者如何像这样愉快地一起使用将非常有用。

这是
C
语法,因此对
C++
有效

c
中,如果希望在声明中删除
struct
关键字,则需要使用
typedef

事实上,如果您声明
typedef
'd和untypedef'd名称,您可以使用任一语法进行初始化

e、 g

对于
c++
而言,在声明
struct
时不需要使用
typedef
,因此在声明实例时使用
struct
是可选的,主要是出于遗留原因


如果您发现自己在跨C/C++代码库中工作,那么了解两者如何像这样愉快地一起工作将非常有用。

struct mystruct
mystruct
同义,假设已经声明了这样的结构

此上下文中的单词
struct

  • 在C语言中完全可选++
  • 如果您倾向于认为它是
    enum
    或其他类型,那么它可能是一种可读性帮助
  • C语言的一种继承,如果给定类似的代码,它将是必需的

struct mystruct
mystruct
同义,假设已经声明了这样一个结构

此上下文中的单词
struct

  • 在C语言中完全可选++
  • 如果您倾向于认为它是
    enum
    或其他类型,那么它可能是一种可读性帮助
  • C语言的一种继承,如果给定类似的代码,它将是必需的

编译器为什么不抱怨,最明显的答案是它的代码是有效的。为什么最简单的答案是它在C中是有效的(并且经常是必要的)这就是原因。这种形式允许C程序员在不使用struct关键字的情况下声明struct对象。为什么最简单的答案是它在C中是有效的(并且经常是必要的)这就是原因。这种形式允许C程序员在不使用struct关键字的情况下声明struct对象。感谢您的解释。正如你所说,我不熟悉这个表单,以前很少使用C。谢谢你的解释。正如您所建议的,我不熟悉这个表单,以前很少使用C。
typedef struct mystruct {
  int val;
} mystruct;

int main()
{
  mystruct x;
  struct mystruct x2;

  /* Do something with x here */
  return(0);
}