你如何在C中声明string常量?
我知道它是相当习惯的,或者至less是在C中把数字常量声明为enum
而不是#define
它们。
/* bad style */ #define MAXLINE 1024 /* good/better style */ enum { MAX_LINE = 1024 };
是否有一个等价的规则来定义string常量?
/* is this good style? */ #define HELLO "Hello World" /* or is this better? */ const char *HELLO2 = "Howdy";
你喜欢哪个? 如果可能的话,显示两种方法的一些缺点。
还有一条(至less)通往罗马的路:
static const char HELLO3[] = "Howdy";
( static
– 可选 – 是为了防止它与其他文件冲突)。 我更喜欢这个const char*
,因为那样你就可以使用sizeof(HELLO3)
,所以你不必延迟到运行时你可以在编译时做什么。
虽然这个定义有一个编译时间级联的优点,但是你也可以调整sizeof(HELLO)
。
但是你也可以更喜欢const char*
并在多个文件中使用它,这将为你节省一点内存。
总之 – 这取决于。
定义string常量的一个好处(虽然非常轻微)是可以连接它们的:
#define HELLO“hello” #定义世界“世界” (HELLO WORLD);
不知道这真的是一个优势,但它是一种不能用于const char *的技术。
如果你想要一个像你的问题所说的“常量string”,我真的会去你在你的问题中陈述的版本:
/* first version */ const char *HELLO2 = "Howdy";
特别是,我会避免:
/* second version */ const char HELLO2[] = "Howdy";
原因:第二个版本的问题是编译器会复制整个string“Howdy”,PLUS该string是可修改的(所以不是真正的const)。
另一方面,第一个版本是const指针HELLO2可访问的常量string,任何人都无法修改它。
#define方法的主要缺点是每次使用该string都会被复制,所以最终可能会在可执行文件中包含大量的副本,使其变得更大。
对于第一个。 枚举是默认的整数,这意味着你可以将该值只传递给只接受整数的东西。
第二个我更喜欢:const char *版本而不是#define。 原因是c中的数组是指针,这意味着每次你想使用#define版本时,你必须实例化这个string才能使用它。