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

kap*_*dit 2 c macros pointers lint const

#define MAXSTR "Maximum number reached"

char *str = MAXSTR;
Run Code Online (Sandbox Code Playgroud)

在做这种操作的同时.代码工作正常,但我得到lint错误.我怎么解决它?

Error:
Assignment of string literal to variable 
Run Code Online (Sandbox Code Playgroud)

如果我使用:

 #define MAXSTR "Maximum number reached"

 char *str = (char *) MAXSTR;
Run Code Online (Sandbox Code Playgroud)

然后lint错误:

Attempt to cast away const (or volatile)
Run Code Online (Sandbox Code Playgroud)

aja*_*jay 7

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

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

#define MAXSTR "Maximum number reached"

const char *str = MAXSTR;  // make the pointer const
Run Code Online (Sandbox Code Playgroud)


Lun*_*din 6

将字符串文字赋值给变量

这是一个可怕的错误信息。我很好奇 Lint 认为字符串文字有什么用处,如果我们不能将它们分配给变量......它应该说:“将字符串文字分配给非常量指针”。

尝试抛弃 const(或 volatile)

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

总而言之,您之所以会出现这些错误,是因为您的静态分析器工具不好。


解释:

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

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

在 Lint 的情况下,它似乎将字符串文字视为const char[],而实际上并非如此。因此,它会给您不正确的错误,而不是指出实际问题。