繁体   English   中英

使用 C 中的结构对相关常量进行分组是一种好习惯吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM