fad*_*bee 4 c arrays struct initialization
我有一个结构:
typedef struct stock {
const char* key1p2; // stock code
const char* key2p2; // short desc
const char* desc1; // description
const char* prod_grp; // product group
const char dp_inqty; // decimal places in quantity
const long salprc_u; // VAT excl price
const long salprc_e; // VAT includive price
const long b_each; // quantity in stock
const long b_alloc; // allocated qty
const char* smsgr_id; // subgroup
const char** barcodes; // barcodes
} stock_t;
Run Code Online (Sandbox Code Playgroud)
我想在每个stock结构的一行代码中初始化这个结构的实例数组.
我试过了:
stock_t data_stock[] = {
{ "0001", "Soup", "Tomato Soup", "71", 0, 100, 120, 10, 0, "", {"12345", "23456", NULL} },
{ "0002", "Melon", "Melon and Ham", "71", 0, 200, 240, 10, 0, "", {"34567", "45678", NULL} },
...
{ NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, NULL, NULL }
};
Run Code Online (Sandbox Code Playgroud)
但它失败了:
data.c:26:74: warning: incompatible pointer types initializing 'const char **' with an expression of type 'char [6]'
[-Wincompatible-pointer-types]
{ "0001", "Soup", "Tomato Soup", "71", 0, 100, 120, 10, 0, "", {"12345", "23456", NULL} },
^~~~~~~
Run Code Online (Sandbox Code Playgroud)
条形码字段是有问题的,因为它是char**.
(那是铿锵的,但GCC报告了类似的错误,但不太有帮助.)
这几乎就像编译器在"12345"之前忽略了大括号.
我可以使用以下方法解决问题:
const char *barcodes0001[] = {"12345", "23456", NULL};
stock_t data_stock[] = {
{ "0001", "Soup", "Tomato Soup", "71", 0, 100, 120, 10, 0, "", barcodes0001 },
Run Code Online (Sandbox Code Playgroud)
这个问题的原因是char []和char*之间是不同的,还是有更微妙的东西.(也许你可以初始化结构数组,但不能初始化数组的结构.)
这并不是说编译器忽略了你的大括号,就好像你的大括号忽略了语言的语法规则.:)
该字段barcode是一个单指针(指针,但它在该点旁边).您需要提供有效的指针值,并且您提供的支撑物不匹配.
你也不能这样做:
struct foo {
int a, b;
};
struct foo *pointer_to_foo = &{ 1, 2 }; /* Not valid code. */
Run Code Online (Sandbox Code Playgroud)
这在逻辑上与您尝试的相同.或者,删除struct,你也不能这样做:
int *pointer_to_a = &12; /* Not valid code. */
Run Code Online (Sandbox Code Playgroud)
您已经分解barcode数据的解决方案就是实现它的方法.
为了避免必须声明一个命名的虚拟变量,您可以使用复合文字
stock_t data_stock[] = {
{ "0001", "Soup", "Tomato Soup", "71", 0, 100, 120, 10, 0, "", (const char*[]){"12345", "23456", NULL} },
{ "0002", "Melon", "Melon and Ham", "71", 0, 200, 240, 10, 0, "", (const char*[]){"34567", "45678", NULL} },
...
{ NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, NULL, NULL }
};
Run Code Online (Sandbox Code Playgroud)
这是一种定义局部临时变量的方法,其语法(type){ initializers }自 c99 以来可用(并且 clang 和 gcc 具有它们)。
编辑:这些复合文字的生命周期与您的变量相同,data_stock所以我想这没问题。无论如何,我认为您应该将大部分字段也标记为const,例如const char*const key1p2;
此外,它会更容易阅读,如果你想使用指定的初始化像
{ .keyp1 = "0001", ... }
Run Code Online (Sandbox Code Playgroud)