我知道在C语言中,将数字常量声明为enum
s而不是#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";
你喜欢哪个?如果可能,显示任何一种方法的一些缺点.
还有一条(至少)通往罗马的道路:
static const char HELLO3[] = "Howdy";
(static
- 可选 - 是为了防止它与其他文件冲突).我更喜欢这个const char*
,因为那时你将能够使用sizeof(HELLO3)
,因此你不必推迟到运行时你可以在编译时做什么.
定义具有编译时连接的优点,但(思考HELLO ", World!"
)也可以sizeof(HELLO)
.
但是,您也可以const char*
在多个文件中使用它,这样可以节省大量内存.
简而言之 - 这取决于.
定义字符串常量的一个优点(尽管非常轻微)是您可以连接它们:
#define HELLO "hello" #define WORLD "world" puts( HELLO WORLD );
不确定这真的是一个优势,但它是一种不能与const char*一起使用的技术.
如果你想要一个像你的问题那样的"常量字符串",那么我真的会选择你在问题中说明的版本:
/* first version */ const char *HELLO2 = "Howdy";
特别是,我会避免:
/* second version */ const char HELLO2[] = "Howdy";
原因:第二个版本的问题是编译器将复制整个字符串"Howdy",PLUS该字符串是可修改的(因此不是真正的const).
另一方面,第一个版本是const指针HELLO2可访问的const字符串,任何人都无法修改它.
#define方法的主要缺点是每次使用时字符串都是重复的,因此您可以在可执行文件中使用它的大量副本,使其更大.