相关疑难解决方法(0)

为什么C++不允许使用匿名结构?

一些C++编译器允许匿名联合和结构作为标准C++的扩展.这有点语法糖,偶尔会非常有帮助.

阻止它成为标准一部分的理由是什么?是否存在技术障碍?一个哲学的?或者仅仅是不足以证明它的合理性?

这是我正在谈论的样本:

struct vector3 {
  union {
    struct {
      float x;
      float y;
      float z;
    };
    float v[3];
  };
};
Run Code Online (Sandbox Code Playgroud)

我的编译器会接受这个,但它警告"无名结构/联合"是C++的非标准扩展.

c++ struct unions

87
推荐指数
3
解决办法
5万
查看次数

如何使用匿名结构/联合编译C代码?

我可以用c ++/g ++做到这一点:

struct vec3 { 
    union {
        struct {
            float x, y, z;
        }; 
        float xyz[3];
    }; 
};
Run Code Online (Sandbox Code Playgroud)

然后,

vec3 v;
assert(&v.xyz[0] == &v.x);
assert(&v.xyz[1] == &v.y);
assert(&v.xyz[2] == &v.z);
Run Code Online (Sandbox Code Playgroud)

将工作.

如何使用gcc在c中执行此操作?我有

typedef struct {
    union {
        struct {
            float x, y, z;
        };
        float xyz[3];
    };
} Vector3;
Run Code Online (Sandbox Code Playgroud)

但我特别是周围都有错误

line 5: warning: declaration does not declare anything
line 7: warning: declaration does not declare anything
Run Code Online (Sandbox Code Playgroud)

c c++ struct anonymous unions

64
推荐指数
5
解决办法
8万
查看次数

"匿名结构"标准吗?而且,真的,他们是什么?

MSDN 认为匿名结构在C++中是非标准的:

Microsoft C扩展允许您在另一个结构中声明结构变量而不为其指定名称.这些嵌套结构称为匿名结构.C++不允许匿名结构.

您可以访问匿名结构的成员,就好像它们是包含结构中的成员一样.

@ K-ballo同意.

我被告知这个功能不一定只是创建一个未命名的结构,但我不能看到标准措辞的区别.

C++ 11说:

[C++11: 9/1]:[..]一个类说明符,类头省略了class-head-name,定义了一个未命名的类.

并为缺少名称的类型定义提供完整的语法结构.

C++ 03缺少这种明确的措辞,但同样表明identifier类型定义中的类型是可选的,并在9.4.2/5和中引用了"未命名的类" 3.5/4.

  • 那么MSDN是错的,这些东西都是完全标准的吗?
  • 或者在"未命名的结构/类"之间是否存在一些微妙之处,并且当用作成员时它们会被这个C++ 03/C++ 11功能覆盖?
  • 我错过了"unnamed struct"和"anonymous struct"之间的一些根本区别吗?它们看起来像我的同义词.

c++

55
推荐指数
3
解决办法
3万
查看次数

为什么要上课{int i; }; 是不是完全符合标准?

这是一个后续问题.

在上一个问题中,@ JohannesSchaub-litb表示以下代码完全符合标准:

class { int i; };  //unnamed-class definition. § 9/1 allows this!
Run Code Online (Sandbox Code Playgroud)

然后他补充道,

虽然它在语法上是有效的,但它违反了这样一个规则,即这样的类必须在其封闭范围内声明至少一个名称.

我真的不明白这一点.他在说什么名字?

任何人都可以进一步详细说明(最好引用标准)?

c++ class definition standards-compliance identifier

43
推荐指数
4
解决办法
2455
查看次数