C++11 结构体 变长数组 继承

七十二寨寨主 2018-12-09 05:12:53
示例代码如下:

x64 [ ~/test ]# cat main.cpp
#include <iostream>
using namespace std;

struct A
{
int nLen;
char buf[];
};

struct B: public A
{
int nValue;
};

int
main(int argc, char *argv[])
{
return 0;
}

使用g++ 4.1.2编译(C++99标准)通过
x64 [ ~/test ]# g++ -v
gcc version 4.1.2
x64 [ ~/test ]# g++ main.cpp
x64 [ ~/test ]#

使用g++ 8.2.0编译(标准是 C++11?? C++14??)
x64 [ ~/test ]# /opt/bin/g++ -v
gcc version 8.2.0 (GCC)
x64 [ ~/test ]# /opt/bin/g++ main.cpp
main.cpp:7:14: error: flexible array member 'A::buf' not at end of 'struct B'
char buf[];
^
main.cpp:12:9: note: next member 'int B::nValue' declared here
int nValue;
^~~~~~
main.cpp:10:8: note: in the definition of 'struct B'
struct B: public A
^
x64 [ ~/test ]#


有了解C++11或C++14的兄弟们,帮解惑一下。遇到这种情况应该怎么处理,只能从设计思路上绕开吗。
...全文
618 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
七十二寨寨主 2020-06-02
  • 打赏
  • 举报
回复
引用 16 楼 我爱世界杯0927 的回复:
我最近也遇到类似的问题。解决办法定义一个结构体.例如:struct A{ char data[10];}; struct B{ int value; int len; A p[0]; };这么定义,然后根据情况申请len个A大小的内存就可以了
谢谢兄弟,好久没登录上来了,后来解决了,就是用的你这种方法。
赵4老师 2018-12-29
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、vector、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
JoeBlackzqq 2018-12-29
  • 打赏
  • 举报
回复
g++4.8.5,是否采用c++11编译选项,都是可以编译成功的, centos7.2


[zcm@localhost dd]$ ll
总用量 4
drwxrwxr-x 2 zcm zcm 71 12月 29 09:21 Debug
-rw-rw-r-- 1 zcm zcm 258 12月 29 09:19 main.cpp
[zcm@localhost dd]$ g++ main.cpp -std=c++11
[zcm@localhost dd]$ ll
总用量 16
-rwxrwxr-x 1 zcm zcm 8864 12月 29 09:24 a.out
drwxrwxr-x 2 zcm zcm 71 12月 29 09:21 Debug
-rw-rw-r-- 1 zcm zcm 258 12月 29 09:19 main.cpp
[zcm@localhost dd]$ g++ -v
使用内建 specs。
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
目标:x86_64-redhat-linux
配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
线程模型:posix
gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
  • 打赏
  • 举报
回复
我最近也遇到类似的问题。解决办法定义一个结构体.例如:struct A{ char data[10];};
struct B{
int value;
int len;
A p[0];
};这么定义,然后根据情况申请len个A大小的内存就可以了
fohoo 2018-12-20
  • 打赏
  • 举报
回复
你用vector不就行了,传不来vector是吧,呵呵,拿你好好理解一下基本vector是什么,有什么传不来的
taodm 2018-12-20
  • 打赏
  • 举报
回复
标准本来就是要求变长数组必须是最后一个成员的。 你应该修正自己的代码,而是不讨论为啥非标行为现在编译器不肯支持了。
真相重于对错 2018-12-17
  • 打赏
  • 举报
回复
引用 12 楼 bravery36 的回复:
[quote=引用 11 楼 真相重于对错 的回复:] [quote=引用 10 楼 bravery36 的回复:] [quote=引用 9 楼 真相重于对错 的回复:] [quote=引用 8 楼 bravery36 的回复:] [quote=引用 7 楼 真相重于对错 的回复:] [quote=引用 5 楼 七十二寨寨主 的回复:] [quote=引用 4 楼 真相重于对错 的回复:] c11支持,c++11不支持
兄弟我想问一下。遇到这种情况,通常会怎么办? 因为我采用网络传输,这种写法在类型转换上非常方便。如果这种写法不可行,是否有常见的替代方案? [/quote] c++不是有vector[/quote] vector不能用于网络传输吧....结构体传过去了指针没有啊...[/quote] 拿到vector了,就不是变长了吧? [/quote] 用vector你还得重新拼装传输的数据, vector的buf和结构体的其他成员都不是一个地方. 说白了没法传输一个vector给对端.[/quote]谁说要传vector 标准库已经推出二十年了,转一下就觉得麻烦的估计不能算程序猿吧? [/quote] 程序员就是能偷懒就偷懒啊, 有更省事的办法肯定要用更省事的, 而且有些场合buf拷贝的成本也是不能无视的. 并不是说不能用vector, 而是讨论某些场合有没有更好的做法.[/quote] 所谓偷懒,有个前提是要对你使用的工具有足够的掌握,而不是走还不利落,就想跑。 至于性能高低,那是相对。只有你熟练掌握基本的c++知识,才能讨论性能。
bravery36 2018-12-17
  • 打赏
  • 举报
回复
引用 11 楼 真相重于对错 的回复:
[quote=引用 10 楼 bravery36 的回复:]
[quote=引用 9 楼 真相重于对错 的回复:]
[quote=引用 8 楼 bravery36 的回复:]
[quote=引用 7 楼 真相重于对错 的回复:]
[quote=引用 5 楼 七十二寨寨主 的回复:]
[quote=引用 4 楼 真相重于对错 的回复:]
c11支持,c++11不支持

兄弟我想问一下。遇到这种情况,通常会怎么办?
因为我采用网络传输,这种写法在类型转换上非常方便。如果这种写法不可行,是否有常见的替代方案?
[/quote]
c++不是有vector[/quote]
vector不能用于网络传输吧....结构体传过去了指针没有啊...[/quote]
拿到vector了,就不是变长了吧?
[/quote]
用vector你还得重新拼装传输的数据, vector的buf和结构体的其他成员都不是一个地方. 说白了没法传输一个vector给对端.[/quote]谁说要传vector
标准库已经推出二十年了,转一下就觉得麻烦的估计不能算程序猿吧?
[/quote]
程序员就是能偷懒就偷懒啊, 有更省事的办法肯定要用更省事的, 而且有些场合buf拷贝的成本也是不能无视的. 并不是说不能用vector, 而是讨论某些场合有没有更好的做法.
真相重于对错 2018-12-14
  • 打赏
  • 举报
回复
引用 10 楼 bravery36 的回复:
[quote=引用 9 楼 真相重于对错 的回复:]
[quote=引用 8 楼 bravery36 的回复:]
[quote=引用 7 楼 真相重于对错 的回复:]
[quote=引用 5 楼 七十二寨寨主 的回复:]
[quote=引用 4 楼 真相重于对错 的回复:]
c11支持,c++11不支持

兄弟我想问一下。遇到这种情况,通常会怎么办?
因为我采用网络传输,这种写法在类型转换上非常方便。如果这种写法不可行,是否有常见的替代方案?
[/quote]
c++不是有vector[/quote]
vector不能用于网络传输吧....结构体传过去了指针没有啊...[/quote]
拿到vector了,就不是变长了吧?
[/quote]
用vector你还得重新拼装传输的数据, vector的buf和结构体的其他成员都不是一个地方. 说白了没法传输一个vector给对端.[/quote]谁说要传vector
标准库已经推出二十年了,转一下就觉得麻烦的估计不能算程序猿吧?
bravery36 2018-12-14
  • 打赏
  • 举报
回复
引用 9 楼 真相重于对错 的回复:
[quote=引用 8 楼 bravery36 的回复:]
[quote=引用 7 楼 真相重于对错 的回复:]
[quote=引用 5 楼 七十二寨寨主 的回复:]
[quote=引用 4 楼 真相重于对错 的回复:]
c11支持,c++11不支持

兄弟我想问一下。遇到这种情况,通常会怎么办?
因为我采用网络传输,这种写法在类型转换上非常方便。如果这种写法不可行,是否有常见的替代方案?
[/quote]
c++不是有vector[/quote]
vector不能用于网络传输吧....结构体传过去了指针没有啊...[/quote]
拿到vector了,就不是变长了吧?
[/quote]
用vector你还得重新拼装传输的数据, vector的buf和结构体的其他成员都不是一个地方. 说白了没法传输一个vector给对端.
真相重于对错 2018-12-13
  • 打赏
  • 举报
回复
引用 8 楼 bravery36 的回复:
[quote=引用 7 楼 真相重于对错 的回复:]
[quote=引用 5 楼 七十二寨寨主 的回复:]
[quote=引用 4 楼 真相重于对错 的回复:]
c11支持,c++11不支持

兄弟我想问一下。遇到这种情况,通常会怎么办?
因为我采用网络传输,这种写法在类型转换上非常方便。如果这种写法不可行,是否有常见的替代方案?
[/quote]
c++不是有vector[/quote]
vector不能用于网络传输吧....结构体传过去了指针没有啊...[/quote]
拿到vector了,就不是变长了吧?
bravery36 2018-12-13
  • 打赏
  • 举报
回复
引用 7 楼 真相重于对错 的回复:
[quote=引用 5 楼 七十二寨寨主 的回复:]
[quote=引用 4 楼 真相重于对错 的回复:]
c11支持,c++11不支持

兄弟我想问一下。遇到这种情况,通常会怎么办?
因为我采用网络传输,这种写法在类型转换上非常方便。如果这种写法不可行,是否有常见的替代方案?
[/quote]
c++不是有vector[/quote]
vector不能用于网络传输吧....结构体传过去了指针没有啊...
真相重于对错 2018-12-13
  • 打赏
  • 举报
回复
引用 5 楼 七十二寨寨主 的回复:
[quote=引用 4 楼 真相重于对错 的回复:] c11支持,c++11不支持
兄弟我想问一下。遇到这种情况,通常会怎么办? 因为我采用网络传输,这种写法在类型转换上非常方便。如果这种写法不可行,是否有常见的替代方案? [/quote] c++不是有vector
bravery36 2018-12-12
  • 打赏
  • 举报
回复
struct A
{
int nLen;
};

struct A1:A
{
char buf[];
};

struct B: public A
{
int nValue;
char buf[];
};
公用结构不要带上buf.
七十二寨寨主 2018-12-12
  • 打赏
  • 举报
回复
引用 4 楼 真相重于对错 的回复:
c11支持,c++11不支持

兄弟我想问一下。遇到这种情况,通常会怎么办?
因为我采用网络传输,这种写法在类型转换上非常方便。如果这种写法不可行,是否有常见的替代方案?
七十二寨寨主 2018-12-10
  • 打赏
  • 举报
回复
引用 2 楼 七十二寨寨主 的回复:
引用 1 楼 真相重于对错 的回复:
数组必须在编译期确定大小
谢谢,不过不是这个问题。这个问题是含有变长数组的结构体,继承之后。在高版本编译器上认为变长数组不是最后一个成员,而低版本编译器支持这种写法。
不知道是否是C++11标准 对这一块的支持做了修改。
七十二寨寨主 2018-12-10
  • 打赏
  • 举报
回复
引用 1 楼 真相重于对错 的回复:
数组必须在编译期确定大小
谢谢,不过不是这个问题。这个问题是含有变长数组的结构体,继承之后。在高版本编译器上认为变长数组不是最后一个成员,而低版本编译器支持这种写法。
真相重于对错 2018-12-10
  • 打赏
  • 举报
回复
c11支持,c++11不支持
真相重于对错 2018-12-09
  • 打赏
  • 举报
回复
数组必须在编译期确定大小

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧