一些C++编译器允许匿名联合和结构作为标准C++的扩展.这有点语法糖,偶尔会非常有帮助.
阻止它成为标准一部分的理由是什么?是否存在技术障碍?一个哲学的?或者仅仅是不足以证明它的合理性?
这是我正在谈论的样本:
struct vector3 {
union {
struct {
float x;
float y;
float z;
};
float v[3];
};
};
Run Code Online (Sandbox Code Playgroud)
我的编译器会接受这个,但它警告"无名结构/联合"是C++的非标准扩展.
下面的代码可以在Visual C++中成功编译.我喜欢它,它很甜!
#include <stdio.h>
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable:4201)
#pragma pack(push,1)
#define PACKED
#else
#define PACKED __attribute__ ((__packed__))
#endif
union A {
struct {
int a:1;
int b:2;
int c1:29;
}PACKED;
struct {
int a:1;
int b:2;
int c2:28;
int d:1;
}PACKED;
int val;
}PACKED;
#ifdef _MSC_VER
#pragma pack(pop)
#pragma warning(pop)
#endif
#undef PACKED
int main(){
A test;
test.val = 0x1078FFF7;
printf("sizeof(A): %d, test.a: %d.\n", sizeof(A), test.a);
return -1;
}
Run Code Online (Sandbox Code Playgroud)
使用MSC构建的文件输出:
sizeof(A): 4, test.a: -1. …Run Code Online (Sandbox Code Playgroud) 下面的示例代码在Visual C++中编译得很好:
class Test {
private:
struct {
struct {
int privateData;
};
};
};
int main(int, char **)
{
Test test;
test.privateData = 0;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但为什么?我期望编译器错误,因为privateData函数main应该无法访问该成员,因为它应该private像它的容器容器一样.我知道无名结构不是官方C++的一部分,但这个设计是asinine.
顺便说一句,我也试图改变private成protected和struct成union:它看起来像编译器拒绝兑付匿名结构和联合嵌套在另一个匿名结构或联合内部的访问修饰符.
有人可以解释这个功能吗?
class Base {
protected:
union {
struct {
bool bBold : 1;
bool bFakeBold : 1;
};
int a;
};
public:
bool isBold() {
return bBold;
}
};
Run Code Online (Sandbox Code Playgroud)
测试类:
#include <assert.h>
#include <stdio.h>
int main()
{
Base d;
d.bBold = false;
assert(d.isBold() == false);
d.bBold = true;
assert(d.isBold() == true);
printf("good");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
msvc11和g ++都编译没有任何错误.
为什么?
在未命名的struct的类型上创建一个参数化的方法/函数很容易.在struct的定义之后获取类型也很容易.
struct Foo {
template <typename T> Foo(T*) { /* we have access to T here */ }
}
template <typename T> void baz(T*) { /* we have access to T here */ }
template<typename T> struct Bar {
/* we have access to T here */
};
void test() {
struct {
Foo foo { this }; // access in a constructor
void test() { baz(this); } // access in a function
} unnamed;
Bar<decltype(unnamed)> bar; // …Run Code Online (Sandbox Code Playgroud) 实际的 C 标准有哪些特性,这些特性最初不是 C 的一部分,而是在 C++ 中/为 C++ 发明的,并且由于它的好处,后来被 C 采用?
一个突出的例子是单行注释//,它最初来自 C++,后来被 C 所采用。
您是否知道实际 C 标准的更多特性,这些特性显式或隐式来自 C++ 的开发?
信息:当然,我知道 C++ 是从 C 派生的,但我只是在考虑从其派生 C++ 的开发中采用了哪些特性。
我想保留任何其他检查-Wpedantic,但会丢失有关未命名结构的警告error: ISO C++ prohibits anonymous structs [-Wpedantic].
我希望能够做到以下几点:
union
{
struct
{
float x, y, z, w;
};
struct
{
float r, g, b, a;
};
float v[4];
};
Run Code Online (Sandbox Code Playgroud)
我正在使用C++ 11并使用-std=c++11标志进行编译.我已经读过C11支持这个功能,但我还没有看到它在C++ 11中得到支持.
我曾经提到过-fms-extensions:
我尝试了旗帜,它似乎没有任何效果(无论在-fms-extensions和之间排序的排列-Wpedantic).
感谢我的评论,我发现了以下内容:
我仍然想知道是否有一种方法可以启用此gcc扩展(我知道所有编译器都有)将禁用该警告.或者是-Wpedantic全有还是全无?
考虑以下:
#include <type_traits>
struct MyType {
int val;
MyType(void) = default;
MyType(int v) : val(v) {}
};
static_assert(std::is_standard_layout<MyType>::value,"Implementation error!");
static_assert(std::is_trivial<MyType>::value,"Implementation error!");
static_assert(std::is_pod<MyType>::value,"Implementation error!");
struct Wrapper {
struct {
MyType t;
};
};
Run Code Online (Sandbox Code Playgroud)
MSVC,Clang和Intel C++都编译得很好.但g++4.9 foo.cpp -std=c++11告诉我:
14:错误:成员'MyType Wrapper :: <anonymous struct> :: t',匿名聚合中不允许使用构造函数
MyType t;
^
编译失败
请注意,static_asserts确保它MyType是标准布局类型,平凡类型,而且实际上是POD(请注意,在C++ 11之后,允许POD具有构造函数).
我找不到任何关于匿名结构中允许哪些类型的权威.我所做的(主要是在SO上)表明,作为POD类型就足够了.显然,事实并非如此.
我的问题:如果作为POD类型实际上不足以进入匿名结构,那么什么是足够的?或者,由于GCC与所有其他编译器不同,这是否是GCC的问题?
这段代码只是为了测试我对结构数组访问的了解.当我执行这段代码时,它给了我两个很多初始化参数的错误.请帮助我理解错误并解决此问题.我试图重用已经由某人解决的代码.关于用参数Param_u param填充Struct的问题
#include <iostream>
#include <stdio.h>
#include <string.h>
#define ARRAY_COUNT(arr) (sizeof (arr) / sizeof *(arr))
typedef union {
struct { // Function parameters
int *array;
size_t size;
};
struct { // Function return value
float mean;
int Median;
};
} Param_u;
int main() {
int array_1[] = {1, 2, 3, 4, 5};
int ret1, ret2;
// Fill the Struct with parameters
Param_u param = {
.array = array_1,
.size = ARRAY_COUNT(array_1),
};
return 0;
}
Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
struct Header
{
unsigned long long int alignment;
};
int main(void)
{
struct Header header; // note: we can loose the 'struct' in C++
struct Header* pheader = &header;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的程序在C和C++中完美编译.
但是当我将Header结构更改为:
struct {
unsigned long long int alignment;
} Header;
Run Code Online (Sandbox Code Playgroud)
它失败并在C中显示以下消息:
error: storage size of ‘Header’ isn’t known
在C++中:
error: aggregate ‘main()::Header header’ has incomplete type and cannot be defined struct Header header;
在K&R的C编程语言书中,存储分配器的实现中使用了类似的结构.我认为这是一回事,但我知道事实并非如此.我也曾在其他地方见过.我当然更熟悉第一个版本.第二个是什么意思,为什么它甚至存在?有什么不同?
下面定义的结构没有结构名称.而且我无法得到阵列部分.提前致谢. 结构数组中的值是什么意思?
#include <stdio.h>
int main()
{
struct
{
int x,y;
} s[] = {10,20,15,25,8,75,6,2};
int *i;
i = s;
clrscr();
printf("%d\n",*(i+3));
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我对从哪里开始解决这个问题有疑问。问题需要如下。
// We want to create a function that will add numbers together,
// when called in succession.
add(1)(2); // == 3
Run Code Online (Sandbox Code Playgroud)
我从未见过以这种方式使用函数,目前我不知道从哪里开始。此外,我尝试对参数链进行一些研究,但这就是我能找到的全部。
https://levelup.gitconnected.com/how-to-implement-method-chaining-in-c-3ec9f255972a
如果你们有任何疑问,我可以编辑我的代码或问题。任何帮助表示赞赏。