我知道在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";
你更喜欢什么?如果可能,显示任何一种方法的一些缺点。
答案 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代码。