C++ 当struct关键字在函数中使用变量声明时,编译器为什么不抱怨呢?
对于这个模糊的问题,我很抱歉,我不确定在简洁的同时如何具体。我在查看同事的代码时注意到以下行为,我不明白为什么编译器(GCC4.8.2)没有抱怨。以下是一个简单的例子: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
#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);
}