【发布时间】:2018-04-15 00:44:08
【问题描述】:
我有需要编译为 C++ 的 C 代码,并且需要对其进行最低限度的更改。
在 C 中,以下工作
typedef struct _type_t
{
int a;
int b;
int c[];
}type_t;
type_t var = {1,2,{1,2,3}};
但在 C++11 中,它给出了错误
错误:
int [0]的初始化程序太多
但我不能给type_t.c 一个恒定大小,因为它需要适用于任何大小的数组。
所以我需要将结构更改为
typedef struct _type_t
{
int a;
int b;
int *c;
}type_t;
但是我需要改变
type_t var = {1,2,{1,2,3}};
因为当前代码给出了错误,所以换成别的东西
错误:
int*类型的标量初始值设定项大括号
将第三个元素转换为(int[]) 会出错
错误:获取临时数组的地址
这是来自micropython, parse.c:
#define DEF_RULE_NC(rule, kind, ...) static const rule_t rule_##rule = { RULE_##rule, kind, #rule, { __VA_ARGS__ } };
如何初始化数组并将其分配给 type_t.c ?
【问题讨论】:
-
gcc 使用您的 C 代码发出警告:“警告:灵活数组成员 [-Wpedantic] 的初始化”( gcc -Wall -pedantic -std=c11 )
-
您需要知道
c的大小才能执行此操作。例如,如果int c[];是int c[3];,它会起作用 -
@Adrian 为什么会这样? C 不是 C++ 不是 C。
-
@Adrian - 不,它在 C 中不起作用。它在您以前提供扩展的编译器下工作。 C 语言规范明确禁止它。
-
@StoryTeller 我猜你是对的:it's not allowed by C standard 但它适用于 gcc。