#define一个字符串文字,然后将其分配给一个char *

时间:2014-04-21 10:54:59

标签: c pointers macros const lint

#define MAXSTR "Maximum number reached"

char *str = MAXSTR;

在做这种操作的同时。代码正在运作&运行正常,但我得到lint错误。我该如何解决?

Error:
Assignment of string literal to variable 

如果我使用:

 #define MAXSTR "Maximum number reached"

 char *str = (char *) MAXSTR;

然后lint错误:

Attempt to cast away const (or volatile)

2 个答案:

答案 0 :(得分:7)

宏是给代码片段的名称。名称出现在源文件中的任何位置,都由代码片段替换。宏定义是C预处理器的指令。它们不是executed意义上的陈述。它们在预处理阶段之后甚至不存在,因此不生成汇编代码。

MAXSTR是一个由字符串文字"Maximum number reached"替换的宏。字符串文字是只读的,它是未定义的行为,试图修改它们。因此,您应该使指针const合格。

#define MAXSTR "Maximum number reached"

const char *str = MAXSTR;  // make the pointer const

答案 1 :(得分:4)

  

将字符串文字分配给变量

这是一个可怕的错误消息。我很好奇Lint认为字符串文字是有益的,如果我们不能将它们分配给变量......它应该说:&#34;将字符串文字分配给非常量指针&#34;。< / p>

  

尝试抛弃const(或volatile)

警告不正确。同样,它应该告诉你指针变量需要是const

总而言之,您会收到这些错误,因为您的静态分析器工具很糟糕。


说明:

C中的字符串文字是字符数组char []。遗憾的是,它们不被语言视为常量类型const char[]。这是C语言中的缺陷,因为如果您尝试对字符串文字进行写访问,则会导致未定义的行为,并且程序可能会崩溃并烧毁。因此,必须将字符串文字视为const数组,即使它们不是。

因此,最好始终将指向字符串文字的指针声明为const char*

对于Lint,它似乎将字符串文字视为const char[],而不是{{1}}。因此,它会为您提供错误的错误,而不是指出实际问题。