0

我用 C 编写了以下行。我想知道该语言是否支持。它是这样的:

char * mode[7] = Config_Msg.DHCP ? "DHCP" : "Static";

基本上我想将“DHCP”或“STATIC”的字符串值插入模式,这取决于 Config_Msg.DHCP 中的值。

当我在 IAR 中编译时,我收到以下警告:

Warning[Pe520]: initialization with "{...}" expected for aggregate  

这个警告是什么意思?

4

5 回答 5

6

警告意味着您的问题的答案是否定的。您正在做的事情可以在运行时完成,但在初始化程序中无效。写吧:

字符 * 模式;

模式 = Config_Msg.DHCP ?“DHCP”:“静态”;

经过仔细检查,这不是您警告的来源。您错误地将 mode 声明为 7 个指针的数组,因此编译器期望对表单进行初始化:

字符 * 模式 [ 7 ] = { “一”、“二”、“三” };

(其余四个条目将被初始化为全零)。

于 2011-11-06T08:17:17.787 回答
3

你不能这样分配字符串,所以你应该这样做:

char mode[7];
strcpy(mode,Config_Msg.DHCP ? "DHCP" : "Static");

请注意,我还更正了您的声明mode。您最初声明了一个指针数组。

或者,您也可以使用指针来执行此操作:

char *mode = Config_Msg.DHCP ? "DHCP" : "Static";
于 2011-11-06T08:15:55.373 回答
1

Mystical 的回答是正确的,但是如果你想知道你的代码不能工作的原因,那就有点复杂了。您可以使用字符串文字作为char数组的初始值设定项,但与所有数组对象一样,表达式(例如?:您正在使用的表达式)中的字符串文字,除了作为&orsizeof运算符的操作数外,会衰减为指针。您的?:表达式的结果是一个指针,并且指针不是数组的有效初始值设定项。

于 2011-11-06T08:20:38.890 回答
0

首先,char * mode[7]应该char mode[7]在你的例子中;你想要一个chars 数组而不是一个char 指针数组。

对于你的问题,不,你不能那样做。你有两个选择:

  1. 声明mode为并char *mode使其指向"DHCP""Static"
  2. 保留mode为数组char复制 "DHCP""Static"放入其中。

请注意,使用第一种方式,您的字符串将是只读的(即存储在 .rodata 段中),与将它们复制到您的数组并可以修改的第二种方式不同。但是,我认为这对这个例子来说不是问题。

于 2011-11-06T08:19:17.683 回答
-2

char *mode[7]的变量是一个指向字符的指针数组。

你所要求的都是不允许的。但你可以编码

char mode[20];

strncpy(mode, sizeof(mode), Config_Msg.DHCP ? "DHCP" : "Static");

编辑添加

实际上,正如其他人指出的那样,strncpy当达到极限时是危险​​的。我的例子应该更好

char mode[20];
memset (mode, 0, sizeof(mode));
strncpy (mode, sizeof(mode)-1, Config_Msg.DHCP ? "DHCP" : "Static");

所以最后一个字节mode仍然是零字节。如果您绝对确定该mode字符串只能是"DHCP",或者"Static"您应该在注释中记录它,并且您可以声明mode为最小长度(7,即静态中的字母数加 1)并使用 just strcpy。但是想象一下,几个月后,您将拥有另一种模式,例如"automatic". 如果你没有注释你的代码,你会搞砸自己的。

即使在几个月内了解自己的代码也会很痛苦。这就是为什么好的评论很重要。

于 2011-11-06T08:17:18.810 回答