gpt4 book ai didi

c - 使用 VS 2012 使用初始化程序列表初始化非聚合的建议

转载 作者:行者123 更新时间:2023-11-30 19:42:14 26 4
gpt4 key购买 nike

我想使用 VS 2012 编译一个非常古老的应用程序。它是用 C 编写的,是在九十年代的某个时候编写的。我已经进行了一系列代码更改,但其中一个有问题。
目前,我在 VS 2012 中收到“无法使用初始化列表初始化非聚合”列表错误。
经过一番研究后,我明白了 VS 2012 发生了什么以及为什么会发生这种情况。
但是,我想了解如何以支持在多个平台上进行编译的方式更改此设置。请注意,我的目的是重写其中的大部分内容,但与此同时,我希望能够编译和检查它。

该结构体的定义为:

struct plantbl {
char max_harmonic[9];
char max_power_of_t;
signed char *arg_tbl;
double *lon_tbl;
double *lat_tbl;
double *rad_tbl;
double distance;
};

该结构在 header 中定义(实际上是两个)

实例的声明和初始化如下:

static struct plantbl mer404 = {
{ 11, 14, 10, 11, 4, 5, 2, 0, 0,},
6,
merargs,
mertabl,
mertabb,
mertabr,
3.8709830979999998e-01,
};

mer* 变量是这样定义的数组:

static signed char merargs[] = { ... long++ list of values };

mer404 变量是在 c 文件的全局命名空间中声明、定义和初始化的。该文件中没有函数。

编译失败:

error C2552: 'mer404' : non-aggregates cannot be initialized with initializer list

经过一些研究、阅读和思考我所读到的内容后,我明白了正在发生的事情以及原因。 我正在寻找建议,使我能够在使用变量的情况下以最小的修改来编译应用程序,并为我提供处理此问题的策略,直到 VS 更好地支持标准。

谢谢

最佳答案

我作弊了。我向 plantbl 结构添加了一个构造函数。这适用于我目前的情况,并且符合我将 C 应用程序移植到 C++ 的计划。无论如何,稍后我将不得不重写结构。我曾希望获得几种可以应用于不同环境(编译器、操作系统、语言版本等)的策略来处理这个问题,这样我就可以进行增量更改以便它可以编译。

对于 WinX 上的 VS2012 针对 C++11 编译为 C++,我执行了以下操作:
请注意,这也可以使用 Apple LLVM 5.0 在 XCode 5.0.2 的 OSX 上编译,并为方言选择 GNC++11。
我包含了定义结构的算法,以便我可以使用 std::copy。

#include <algorithm>

我改变了 plantbl 结构

struct plantbl {
char max_harmonic[9];
char max_power_of_t;
signed char *arg_tbl;
double *lon_tbl;
double *lat_tbl;
double *rad_tbl;
double distance;
};

struct plantbl {
char max_harmonic[9];
char max_power_of_t;
signed char *arg_tbl;
double *lon_tbl;
double *lat_tbl;
double *rad_tbl;
double distance;

plantbl(char MH[9], char MPoT, signed char* ArgT, double* LonT, double* LatT, double* RadT, double Dist)
:max_power_of_t(MPoT), arg_tbl(ArgT), lon_tbl(LonT), lat_tbl(LatT), rad_tbl(RadT), distance(Dist)
{ std::copy(max_harmonic, max_harmonic + 9, MH); }
};

plantbl 结构在全局命名空间中定义。

我更改了声明和实例化:

static struct plantbl mer404 = {
{ 11, 14, 10, 11, 4, 5, 2, 0, 0,},
6,
merargs,
mertabl,
mertabb,
mertabr,
3.8709830979999998e-01,
};

char mer404Temp[9] = { 11, 14, 10, 11,  4,  5,  2,  0,  0 };
plantbl mer404
(
mer404Temp,
6,
merargs,
mertabl,
mertabb,
mertabr,
3.8709830979999998e-01
);

请注意,我添加了一个数组,它也位于全局命名空间中。我也对其他八个实例进行了类似的更改。

这可能是最无效的解决方案,可能会产生意想不到的后果,并且可能不起作用。然而,它的编译使我能够继续前进。

在研究这个问题时,我看到了很多解释,但建议不多。如果有关于处理原始问题的建议,我欢迎。

关于c - 使用 VS 2012 使用初始化程序列表初始化非聚合的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32533753/

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