结构初始化警告
Warning with struct initialization
我有这个结构:
struct ChangeIntItem
{
char *unit;
const char **parser;
int *changevalue;
uint16_t *change_eeprom_value;
int maximum;
int minimum;
};
我想用这个结构变量初始化其他变量:
struct ChangeIntItem ChangeIntItemTypeBoolean = { .unit = "", .minimum = 0, .maximum = 1, .parser = {"off", "on"}};
它工作正常,但我收到一些警告:
Severity Code Description Project File Line
Warning braces around scalar initializer Handsteuerung C:\Users\... 11
Severity Code Description Project File Line
Warning (near initialization for 'ChangeIntItemTypeBoolean.parser') Handsteuerung C:\Users\... 11
Severity Code Description Project File Line
Warning initialization from incompatible pointer type Handsteuerung C:\Users\... 11
Severity Code Description Project File Line
Warning (near initialization for 'ChangeIntItemTypeBoolean.parser') Handsteuerung C:\Users\... 11
Severity Code Description Project File Line
Warning excess elements in scalar initializer Handsteuerung C:\Users\... 11
Severity Code Description Project File Line
Warning (near initialization for 'ChangeIntItemTypeBoolean.parser') Handsteuerung C:\Users\... 11
在另一种情况下,我编写了一个将结构变量设置为默认值的函数,但我更喜欢这种方法,因为它更短。
所有错误都是由“.parser = {"off", "on"}”引起的,但我没有弄错...
可以使用compound literals,所以把init改成
struct ChangeIntItem ChangeIntItemTypeBoolean = { .unit = "", .minimum = 0, .maximum = 1, .parser = (const char *[]){"off", "on"}};
测试
#include <stdio.h>
#include <stdint.h>
struct ChangeIntItem
{
char *unit;
const char **parser;
int *changevalue;
uint16_t *change_eeprom_value;
int maximum;
int minimum;
};
int main()
{
struct ChangeIntItem ChangeIntItemTypeBoolean = { .unit = "", .minimum = 0, .maximum = 1, .parser = (const char *[]){"off", "on"}};
printf ("%s - %s\n", ChangeIntItemTypeBoolean.parser[0], ChangeIntItemTypeBoolean.parser[1]);
}
输出
off - on
成员parser
是一个指针。
改成指针数组,这样初始化可以保持不变:
const char *parser[2];
或者使用复合文字或其他变量:
.parser = ( const char*[]){"off", "on"}
const char* array[2] = {"off", "on"};
.parser = array
我有这个结构:
struct ChangeIntItem
{
char *unit;
const char **parser;
int *changevalue;
uint16_t *change_eeprom_value;
int maximum;
int minimum;
};
我想用这个结构变量初始化其他变量:
struct ChangeIntItem ChangeIntItemTypeBoolean = { .unit = "", .minimum = 0, .maximum = 1, .parser = {"off", "on"}};
它工作正常,但我收到一些警告:
Severity Code Description Project File Line
Warning braces around scalar initializer Handsteuerung C:\Users\... 11
Severity Code Description Project File Line
Warning (near initialization for 'ChangeIntItemTypeBoolean.parser') Handsteuerung C:\Users\... 11
Severity Code Description Project File Line
Warning initialization from incompatible pointer type Handsteuerung C:\Users\... 11
Severity Code Description Project File Line
Warning (near initialization for 'ChangeIntItemTypeBoolean.parser') Handsteuerung C:\Users\... 11
Severity Code Description Project File Line
Warning excess elements in scalar initializer Handsteuerung C:\Users\... 11
Severity Code Description Project File Line
Warning (near initialization for 'ChangeIntItemTypeBoolean.parser') Handsteuerung C:\Users\... 11
在另一种情况下,我编写了一个将结构变量设置为默认值的函数,但我更喜欢这种方法,因为它更短。
所有错误都是由“.parser = {"off", "on"}”引起的,但我没有弄错...
可以使用compound literals,所以把init改成
struct ChangeIntItem ChangeIntItemTypeBoolean = { .unit = "", .minimum = 0, .maximum = 1, .parser = (const char *[]){"off", "on"}};
测试
#include <stdio.h>
#include <stdint.h>
struct ChangeIntItem
{
char *unit;
const char **parser;
int *changevalue;
uint16_t *change_eeprom_value;
int maximum;
int minimum;
};
int main()
{
struct ChangeIntItem ChangeIntItemTypeBoolean = { .unit = "", .minimum = 0, .maximum = 1, .parser = (const char *[]){"off", "on"}};
printf ("%s - %s\n", ChangeIntItemTypeBoolean.parser[0], ChangeIntItemTypeBoolean.parser[1]);
}
输出
off - on
成员parser
是一个指针。
改成指针数组,这样初始化可以保持不变:
const char *parser[2];
或者使用复合文字或其他变量:
.parser = ( const char*[]){"off", "on"}
const char* array[2] = {"off", "on"};
.parser = array