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

时间:2009-09-16 07:56:58

标签: c

我知道在C语言中,将数字常量声明为enum而不是#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";

你更喜欢什么?如果可能,显示任何一种方法的一些缺点。

5 个答案:

答案 0 :(得分:90)

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

static const char HELLO3[] = "Howdy";

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

虽然定义具有编译时连接的优点(想想HELLO ", World!"),但您也可以sizeof(HELLO)

但是你也可以选择const char*并在多个文件中使用它,这样可以节省大量的内存。

简而言之 - 取决于。

答案 1 :(得分:16)

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

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

puts( HELLO WORLD );

不确定这确实是一个优势,但事实确实如此 一种不能与const char *一起使用的技术。

答案 2 :(得分:11)

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

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

特别是,我会避免:

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

原因:第二个版本的问题是编译器会复制整个字符串“Howdy”,PLUS该字符串是可修改的(所以不是真正的const)。

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

答案 3 :(得分:8)

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

答案 4 :(得分:0)

它们有一些区别。

#define HELLO "Hello World"

上面的语句可以与预处理器一起使用,并且只能在预处理器中进行更改。

const char *HELLO2 = "Howdy";

以上语句可以用C代码更改。现在,您不能像下面的语句一样更改每个字符,因为它的常数。

HELLO2[0] = 'a'

但是您可以做的是让它指向另一个字符串,例如语句 下面

HELLO2 = "HELLO WOLRD"

这实际上取决于您希望如何更改变量。 带有预处理器或C代码。