是否有必要在声明char const * ptr =“some characters”时使用'const'?

时间:2011-04-14 09:37:38

标签: c++ c

因为它们都指向无法修改的字符。在第一个中使用const有什么好处?是否只是告诉编译器要注意可能执行ptr[1] = 'a'

之类的任何代码
  1. char const *ptr = "some characters"
  2. char *ptr = "some characters"

6 个答案:

答案 0 :(得分:4)

是的,因此当您尝试通过指针修改内容时,您将在运行时收到编译器错误而不是令人讨厌的意外。

答案 1 :(得分:3)

在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,都无法解决任何问题。

答案 2 :(得分:2)

使用const很少“必要”,从纯粹的“执行此代码会产生预期结果”的观点来看。

然而,大量使用const对于阅读代码并试图理解它的人来说是一个巨大的帮助。这很值得。我建议始终将const放在任何可行的地方。

以类似的方式,出于几乎相同的原因,总是将函数声明为严格本地的static

答案 3 :(得分:1)

建议这样做:

char const *ptr = "some characters";

以下是建议,因为您可能会尝试将 const 数据ptr点更改为。

char *ptr = "some characters"; 

好的编制者应该在第二种情况下发出警告。

海湾合作委员会(4.3.4)确实发出警告:

  

prog.cpp:7:警告:不推荐将字符串常量转换为'char *'

自己看看:http://www.ideone.com/8FqyZ

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

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