[英]Is it a good practice to group related constants using structs in C?
我想知道将结构用作伪名称空间(à la C++)来对在功能上或概念上彼此相关的常量进行分组是否是个好主意。
static const struct {
const unsigned int START;
const unsigned int END;
} COUNTER = {.START = 1, .END = 100};
这有什么缺点吗? 如果不是,将 struct 实例及其成员都声明为const
是否是多余的(甚至可能不方便)? 应该在哪里说明这些值的恒定性?
我想知道将结构用作伪名称空间是否是个好主意
好吧,这可能是个好主意。 它本质上并不坏。 反对的一个论点是,如果您觉得需要命名空间,那么 C 很可能首先是错误的语言。 但是可以这样使用,有时也这样使用。
应该在哪里说明这些值的恒定性?
一般来说,将整个结构声明为 const 就足够了。 但要小心指针。 此代码有效,将打印“42”:
int x = 5;
const struct {
int *p;
} S = {.p = &x };
int main()
{
*(S.p) = 42;
printf("%d\n", x);
}
在上面的代码中,你不能改变 Sp 使它指向别的东西,但是 const 指针和指向 const 的指针是有区别的。 所以对于指针,添加一个额外的常量可能是个好主意。
为了澄清,指针p
将被声明为int * const p
这意味着您不能更改指针本身,但为了保护它指向的数据,您需要const int *p
。 要同时获得两者,请使用const int * const p
,但如果将结构声明为 const,您将“免费”获得其中之一,因此const int *p
足以获得两者。
而且,如果您考虑指向指针的指针,那么请考虑很长时间并对其进行测试以确保它以您想要的方式工作。
来自评论:
为什么不是枚举?
因为这是无效的:
enum S {a = 5};
enum Y {a = 6};
编译器会告诉你a
已经定义了。 所以枚举不适合模拟命名空间。 此外,您不能将枚举用于非整数。
使用 C 中的结构对相关常量进行分组是一种好习惯吗?
它是基于意见的。 如果它对你有用,那就去做吧。
我不会那样做,我 C。 相反,我使用#define
喜欢:
#define GROUPNAME_NAME
所以在你的情况下我会做
#define COUNTER_START 1
#define COUNTER_END 100
在 C++ 我会这样做:
const unsigned int COUNTER_START = 1;
const unsigned int COUNTER_END = 100;
C 和 C++ 之间的差异是由于语言规范的差异。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.