内联结构声明

Posted

技术标签:

【中文标题】内联结构声明【英文标题】:Inline struct declaration 【发布时间】:2011-10-11 09:26:01 【问题描述】:

我有兴趣注意到 C++(特别是 VSVC++ 2008)允许我在方法中声明一个内联结构。 例如:

MyClass::method()

 struct test int x;;
 test t = 99;

我的问题是,这个声明在内部是如何工作的,特别是它是否会对性能产生负面影响?

【问题讨论】:

Usage of local class in C++ function的可能重复 本地类。 possible duplicate 了解更多信息。 【参考方案1】:

这个声明在内部是如何工作的?

与命名空间范围内的声明完全一样,只是名称仅在声明它的块(在本例中为函数体)的范围内可见。更新:正如@Nawaz 指出的那样,有一个或两个额外的限制适用于本地类:它们不能有静态数据成员,并且(在 C++03 中,但不是 C++11 中)它们不能用作模板类型参数。

它对性能有任何负面影响吗?

不,除了它的范围(只影响代码是否编译)之外,它与任何其他类定义相同。

【讨论】:

不完全正确的答案。本地类和命名空间类之间有很多区别。查看可能的重复项:***.com/questions/5714616/… @Nawaz:谢谢,我确实稍微简化了一点,我实际上并不知道他们不能拥有静态数据成员。我认为现在的答案更正确。【参考方案2】:

在函数范围内或外部定义类型的主要区别在于范围。也就是说,如果它是在函数内部定义的,它将无法在函数外部访问。

虽然还有其他区别(至少在 C++03 中,我没有重新检查 C++11),你不能在本地类中拥有静态成员或模板成员。您也不能将该本地类用作模板的参数(此限制已在 C++11 中删除),IIRC 这是因为本地类具有内部链接(而不是命名空间级别类的外部链接),并且需要模板参数是外部链接。

【讨论】:

以上是关于内联结构声明的主要内容,如果未能解决你的问题,请参考以下文章

C++ 内联函数:这样声明,这样定义,还是两者兼而有之?为啥?

如何在没有扩展内联 asm 的情况下在 gcc 内联汇编中声明和初始化局部变量?

内联函数

内联函数

导出内联声明的类函数

golang 声明接口内联的语法