gpt4 book ai didi

c++ - 为什么/如何编译?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:03 25 4
gpt4 key购买 nike

MS Visual Studio 2008 中的 C++。警告级别 4 加上大量额外警告也已启用。我希望这会发出警告至少,但更有可能是编译器错误?

函数声明如下:

int printfLikeFunction(
const int bufferLength,
char * const buffer,
const char * const format,
... );

代码使用 - 有一个拼写错误:虽然传入了 outputBuffer 的 ARRAY_SIZE,但 outputBuffer 本身不是 - 这肯定不应该编译:

printfLikeFunction( ARRAY_SIZE( outputBuffer ), "Format: %s, %s", arg1, arg2 );

显然这是错误的,并且犯了一个错误。但是编译器应该已经捕获了它! buffer 参数应该是一个字符指针,并且传递给它的是一个字符串文字,它是一个常量字符指针。这一定是一个错误。 (arg1 和 arg2 也是(可能是 const)char 指针,所以巧合的是,即使 outputBuffer 不在正确的位置,声明也匹配)。

在运行时,此代码在尝试写入字符串文字时崩溃。不足为奇,我只是不明白它是如何被允许编译的。

(不过,顺便说一句,这大概就是为什么 sprintf_s 的缓冲区和大小参数的顺序与此函数不同的原因 - 它使此类错误明确失败)。

最佳答案

C++ 有一个特殊的字符串字面量漏洞,以兼容 pre-const C 风格的代码。虽然字符串文字是 const char 数组,但它们可以转换为指向非 const char 的指针。

释义 4.2/2 [conv.array]:“窄”字符串文字可以转换为指向非 const char 类型指针的右值。只有在存在明确的目标类型(例如函数参数)时才考虑转换,而不是在需要从左值到右值的一般转换时考虑。

此转换已弃用,但仍然可用。请注意,虽然转换允许将文字转换为指向非 const char 类型的指针,但它仍会调用未定义的行为来尝试通过此指针修改字符串文字中的任何字符。

关于c++ - 为什么/如何编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1530330/

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