你如何在C中声明字符串常量?

61 c

我知道在C语言中,将数字常量声明为enums而不是#define它们是非常惯用的,或者至少是好的风格.

/* bad style */
#define MAXLINE 1024

/* good/better style */
enum {
    MAX_LINE = 1024
};
Run Code Online (Sandbox Code Playgroud)

字符串常量的定义是否有等效规则?

/* is this good style? */
#define HELLO "Hello World"

/* or is this better? */
const char *HELLO2 = "Howdy";
Run Code Online (Sandbox Code Playgroud)

你喜欢哪个?如果可能,显示任何一种方法的一些缺点.

Mic*_*ker 92

还有一条(至少)通往罗马的道路:

static const char HELLO3[] = "Howdy";
Run Code Online (Sandbox Code Playgroud)

(static- 可选 - 是为了防止它与其他文件冲突).我更喜欢这个const char*,因为那时你将能够使用sizeof(HELLO3),因此你不必推迟到运行时你可以在编译时做什么.

定义具有编译时连接的优点,但(思考HELLO ", World!")也可以sizeof(HELLO).

但是,您也可以const char*在多个文件中使用它,这样可以节省大量内存.

简而言之 - 这取决于.


Wil*_*ell 19

定义字符串常量的一个优点(尽管非常轻微)是您可以连接它们:

#define HELLO "hello"
#define WORLD "world"

puts( HELLO WORLD );

不确定这真的是一个优势,但它是一种不能与const char*一起使用的技术.


Vir*_*ren 12

如果你想要一个像你的问题那样的"常量字符串",那么我真的会选择你在问题中说明的版本:

/* first version */
const char *HELLO2 = "Howdy";
Run Code Online (Sandbox Code Playgroud)

特别是,我会避免:

/* second version */
const char HELLO2[] = "Howdy";
Run Code Online (Sandbox Code Playgroud)

原因:第二个版本的问题是编译器将复制整个字符串"Howdy",PLUS该字符串是可修改的(因此不是真正的const).

另一方面,第一个版本是const指针HELLO2可访问的const字符串,任何人都无法修改它.

  • 我认为这个答案有两个错误:1)第二个版本创建一个常量字符串,它是不可修改的,至少在保护内存的系统上是这样。如果此变量是静态的,则不会进行复制。2)指针不是常量,只是它指向的字符。要获得只读指针,您需要编写 `const char * const HELLO2 = "Howdy";` (3认同)

Rik*_*ood 8

#define方法的主要缺点是每次使用时字符串都是重复的,因此您可以在可执行文件中使用它的大量副本,使其更大.

  • 我相信编译器至少会在同一个文件中使用它们时优化它们.所以这并不是"每次使用它",但是,定义全局常量有时会节省空间. (7认同)
  • 这是真的,除非编译器或链接器将副本折叠成一个副本.此功能有时也称为"字符串池" (3认同)