gpt4 book ai didi

c++ - gcc 6 但不是 gcc 4 的灵活数组错误

转载 作者:行者123 更新时间:2023-11-30 05:25:42 28 4
gpt4 key购买 nike

我正在尝试编译同事编写的一段代码。在装有 gcc 6.1.1 的机器上,出现此错误:

In file included from src/TYAGlobalLibs.cc:1:0:
./include/TYAGlobalLibs.hh:112:17: error: flexible array member ‘TYA::TMultiHist::fh’ not at end of ‘class TYA::TMultiHist’
TH1F *fh[];
^
./include/TYAGlobalLibs.hh:102:9: note: in the definition of ‘class TYA::TMultiHist’
class TMultiHist{
^~~~~~~~~~

这似乎是禁止的代码路径,因此会触发编译器错误;然而,使用 gcc 4.5.2 编译相同的文件没有错误。我将这些编译器选项用于 g++:

-O2 -Wall -fPIC -pthread -m32 -std=c++98

对于 6.1.1 和 4.5.2。如果重要的话,gcc 6 在 64 位机器上运行,而 gcc 4 在 32 位机器上运行。这是重现问题的最小代码片段:

struct test{
int a;
float b[];
double c;
};

int main(){
}

有没有人知道为什么会发生这种情况,最终是否有编译器选项可以使 gcc 6 编译无误(我没有机会更改代码,它不在我的控制之下)?

最佳答案

在 C(C99 及更高版本)中,灵活数组成员 可以用 [] 定义,并且必须是结构的最后一个成员。 C++ 不支持灵活的数组成员,但 g++ 允许它们作为语言扩展。

旧版本的 g++ 不需要灵活的数组成员作为类或结构的最后一个成员。这是一个错误,已在较新版本的 g++ 中得到纠正。

这里有一个小的测试程序,基于你的程序来说明问题:

#include <iostream>
#include <cstddef>

static int mem[100];

struct test{
int a;
int b[];
int c;
};

int main(){
test *ptr = (test*)&mem;
ptr->a = 10;
ptr->b[0] = 20;
ptr->b[1] = 30;
ptr->c = 40;

std::cout << "ptr->a = " << ptr->a << "\n";
std::cout << "ptr->b[0] = " << ptr->b[0] << "\n";
std::cout << "ptr->b[1] = " << ptr->b[1] << "\n";
std::cout << "ptr->c = " << ptr->c << "\n";
}

这是我用 g++ 4.1.2 编译时的输出:

ptr->a    = 10
ptr->b[0] = 40
ptr->b[1] = 30
ptr->c = 40

如您所见,成员 c 分配在与 b[0] 相同的偏移处。

(严格来说,由于可能存在对齐问题,使用 int[] 数组来保存 test 对象并不是 100% 安全的,但这不太可能是实践中的问题。)

很可能您的代码因此而存在未发现的错误。

您的问题不在于较新的 g++ 拒绝了您的代码;只是旧的没有。

重新排序成员声明,​​使灵活的数组成员出现在最后是最简单的解决方法——尽管您(或其他人)需要仔细检查该类型的使用方式。一个更好的解决方案可能是用一些 C++ 容器类替换灵活的数组成员,也许是 std::vector

(I have no chance of changing the code, it's not under my control)

某人能够更改代码,而且您大概能够提交错误报告。

关于c++ - gcc 6 但不是 gcc 4 的灵活数组错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38130887/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com