你如何在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才能使用它。