您在谈论 C 字符串,它实际上是 char 的向量。在 C++ 中,std::string
使用了类,并且将常量字符串创建为const std::string
.
无论如何,编译器会在未来的程序中保留一块内存,以存储出现在源代码中的文字字符串。这部分内存被认为是只读的,所以你应该用const char *
. 它的大小正好是字符串的大小加上尾随零的一个额外位置,标记字符串的结尾。
编译器需要保持向后兼容性,因此它们仍然接受由char *
. 但是,这是一种误导,因为您不应该能够修改可以存储在嵌入式系统的 ROM 中的内存。
在我的系统中,我使用 clang:
$ clang --version
Ubuntu clang version 3.0-6ubuntu3 (tags/RELEASE_30/final) (based on LLVM 3.0)
Target: i386-pc-linux-gnu
Thread model: posix
在 clang C 编译器中,这段代码编译没有错误:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char * str = "Hello, World!";
printf( "%s", str );
return EXIT_SUCCESS;
}
但是,相同的代码(稍作修改,例如标头的名称)在编译为 C++ 程序时会引发以下警告:
kk.cpp:6:15: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
char * str = "Hello, World!";
^
1 warning generated.
希望这可以帮助。