在声明char const *ptr ="某些字符"时是否有必要使用"const"?

Is is necessary to have the 'const' in declaring char const *ptr = "some characters"?

本文关键字:const 是否 char 声明 ptr 字符      更新时间:2023-10-16

因为它们都指向不能修改的字符。在第一个函数中使用const的好处是什么?它只是告诉编译器注意任何可能做类似ptr[1] = 'a'

的代码吗?
  1. char const *ptr = "some characters"
  2. char *ptr = "some characters"

是的,这样当你试图通过指针修改内容时,你将得到一个编译器错误,而不是在运行时令人讨厌的意外

在c++中,将const char[N](字符串文字的实际类型)转换为char *已被弃用,并且在c++ 11中不再工作(c++ 11, c++ 03§4.2)。所以,第2条是刚刚被打破的。c++ 98/c++ 03编译器通常会产生一个警告;c++ 0x/c++ 11编译器应该完全拒绝。

const的要点是编译器可以告诉您何时试图删除或违反它。即使您不打算修改这些字符,其好处是,如果您不小心修改了这些字符,则会发生错误。

您总是可以使用const_cast来解决它,尽管在这种情况下,内存可能是只读的,物理上或通过MMU,无法解决任何问题。

使用const很少是"必要的",从纯粹的"执行这段代码将得到预期的结果"的角度来看。

然而,大量使用const对于任何阅读代码并试图理解它的人来说都是一个巨大的帮助。这很有价值。我建议总是把const放在它能工作的地方。

与此类似,出于几乎相同的原因,始终将旨在严格本地化的函数声明为static

建议:

char const *ptr = "some characters";

下面是不建议,因为您可能会尝试更改ptr指向的const数据。

char *ptr = "some characters"; 

好的编译器应该在第二种情况下给出警告。

GCC(4.3.4)给出警告:

prog.cpp:7:警告:从字符串常量到' char* '的转换已弃用

See yourself: http://www.ideone.com/8FqyZ

这是告诉编译器注意任何可能试图改变字符串的代码。虽然,您可以聪明地更改字符串,但通常这是为了防止代码中的意外错误。

C中,以下两个定义都是完全合法和合理的。

char const *ptr1 = "some characters";
char *ptr2 = "some characters";

C中,字符串字面值是char[]类型的值。在大多数情况下,它会衰减为char*类型的值。对许多人来说,添加const修饰符是一个好习惯:如果代码试图改变字符串字面量(这是未定义的行为),它会让编译器报错。

相关文章: