gpt4 book ai didi

c - GCC 编译器并将 const char* 转换为 char *

转载 作者:太空狗 更新时间:2023-10-29 15:12:00 27 4
gpt4 key购买 nike

我正在尝试构建 M-SIM 架构模拟器,但是当我运行 make 实用程序时,gcc 报告此错误(它甚至不是警告)

注意:需要 'char *' 但参数是 'const char *' 类型

从什么时候开始这被认为是一个错误。是否有任何标志可以绕过此检查?

最佳答案

这是一个错误,因为将 const char* 参数传递给采用 char* 参数的函数违反了常量正确性;它将允许您修改 const 对象,这将破坏 const 的全部目的。

例如,这个C程序:

#include <stdio.h>

void func(char *s) {
puts(s);
s[0] = 'J';
}

int main(void) {
const char message[] = "Hello";
func(message);
puts(message);
return 0;
}

从 gcc 生成以下编译时诊断:

c.c: In function ‘main’:
c.c:10:5: warning: passing argument 1 of ‘func’ discards qualifiers from pointer target type
c.c:3:6: note: expected ‘char *’ but argument is of type ‘const char *’

最后一条消息被标记为“注释”,因为它引用了 func() 的(完全合法的)声明,解释了警告所引用的参数声明。

就 C 标准而言,这是违反约束的情况,这意味着编译器可以将其视为 fatal error 。默认情况下,gcc 只是对此发出警告并执行从 const char*char* 的隐式转换。

当我运行程序时,输出是:

Hello
Jello

这表明,即使我将 message 声明为 const,该函数也能够修改它。

由于 gcc 没有将此视为 fatal error ,因此无需抑制任何诊断消息。代码完全有可能无论如何都会工作(比如,如果函数没有碰巧修改任何东西)。但警告的存在是有原因的,您或 M-SIM 架构模拟器的维护者可能应该看看这个。

(将字符串文字传递给 func() 不会触发这些诊断,因为 C 不会将字符串文字视为 const。(它确实使行为尝试修改未定义的字符串文字。)这是出于历史原因。gcc 确实有一个选项,-Wwrite-strings,这会导致它将字符串文字视为 const ; 这实际上违反了 C 标准,但它可能是一个有用的检查。)

正如我在评论中提到的,如果您能向我们展示触发诊断的代码,将会很有帮助。

我什至自己下载并构建了 M-SIM 架构模拟器,但我没有看到该特定消息。

关于c - GCC 编译器并将 const char* 转换为 char *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8905364/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com