当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《你如何在C中声明字符串常量?》经验,为你挑选了4个好方法。

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

/* bad style */
#define MAXLINE 1024

/* good/better style */
enum {
    MAX_LINE = 1024
};

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

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

/* or is this better? */
const char *HELLO2 = "Howdy";

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



1> Michael Krel..:

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

static const char HELLO3[] = "Howdy";

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

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

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

简而言之 - 这取决于.



2> William Purs..:

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

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

puts( HELLO WORLD );

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



3> Viren..:

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

/* first version */
const char *HELLO2 = "Howdy";

特别是,我会避免:

/* second version */
const char HELLO2[] = "Howdy";

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

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



4> Rik Heywood..:

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


我相信编译器至少会在同一个文件中使用它们时优化它们.所以这并不是"每次使用它",但是,定义全局常量有时会节省空间.
这是真的,除非编译器或链接器将副本折叠成一个副本.此功能有时也称为"字符串池"
推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有