我知道,在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";

倾向于什么?如果可能的话,说明这两种方法的一些缺点.

推荐答案

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

static const char HELLO3[] = "Howdy";

(static-可选-用于防止与其他文件冲突).我更喜欢这个而不是const char*,因为这样你就可以使用sizeof(HELLO3),因此你不必把编译时可以做的事情推迟到运行时.

不过,定义具有编译时串联的优势(考虑HELLO ", World!"),您也可以使用sizeof(HELLO).

但是,您也可以 Select const char*,然后跨多个文件使用它,这将为您节省一点内存.

In short — it depends.

C++相关问答推荐

为什么这个gcc迂腐的人忽视了扩展?

C中空终止符后面的数字?

你能用自己的地址声明一个C指针吗?

如何避免重新分配指针数组时,我们从一开始就不知道确切的大小

由Go调用E.C.引起的内存快速增长

如何将已分配的数组(运行时已知的大小)放入 struct 中?

C:二进制搜索和二进制插入

可以将C变量限制为特定的读/写速度吗?

Boyer Moore算法的简单版本中的未定义行为

接受任何参数的函数指针是否与接受不同参数的函数兼容

Tic-tac-toe:从文件加载存储

如何在VSCode中创建和使用我自己的C库?

Go和C中的数据 struct 对齐差异

程序对大输入给出错误答案

共享目标代码似乎不能在Linux上的进程之间共享

Linux/C:带有子进程的进程在添加waitid后都挂起

为什么GCC 13没有显示正确的二进制表示法?

模仿 memmove 的行为

根据输入/输出将 C 编译过程分为预处理、编译、汇编和链接步骤

使用复合文字数组初始化的指针数组