gpt4 book ai didi

c - 使用静态常量结构来限制 C 中常量的名称冲突有什么问题吗?

转载 作者:太空狗 更新时间:2023-10-29 17:10:32 24 4
gpt4 key购买 nike

例如,如果我要在 header (.h) 文件中创建这样的分层 static const struct:

static const struct {
struct {
char STATIC /* = 0 */;
char DYNAMIC /* = 1 */;
} ALLOCATION;
struct {
char TABLE /* = 0 */;
char LIST /* = 1 */;
char TREE /* = 2 */;
} STRUCTURE;
} FOO_STRATEGY = { {0, 1}, {0, 1, 2} };

foo_t *foo_create(char allocation_strategy, char structure_type);

然后将使用这样的东西:

foo_t *foo = foo_create(FOO_STRATEGY.ALLOCATION.STATIC, FOO_STRATEGY.STRUCTURE.TREE);

我想我有一个两部分的问题:

  1. 这是否像人们预期的那样工作?
  2. 为什么其他人不这样做?

最佳答案

我看到四个可能的问题。如果您不关心这些,那就去做吧。

  1. 您无法执行此示例中的操作,其中枚举值用于将索引“命名”到数组中,而枚举中的最后一个条目自动给出数组大小。

    typedef enum {
    COLOR_RED,
    COLOR_GREEN,
    COLOR_BLUE,
    NUM_COLORS
    } Color;


    int myPallete[NUM_COLORS];
    myPallete[COLOR_RED] = 0xf80000;

    您可能还有其他方法可以将 #defineenum 用作常量,这样您的方法在 C 中不起作用。这只是第一个想到的。

  2. 以这种方式在 header 中声明结构会将结构的副本 放入生成的每个目标文件中。浪费的内存使得这对深度嵌入式系统不友好,在深度嵌入式系统中,每个目标文件浪费 5 个字节或 RAM 会很糟糕。将您的结构放在一个“.c”文件中并使用 extern 在 header 中声明它可能会有所帮助。

  3. 没有其他人这样做,因此您创建的代码让其他第一次查看您的代码的人感到困惑,但我认为调整起来并不难。我不在乎你在这里有什么看法。如果多个评论员说这会令人困惑,那么您已经让那些人感到困惑了。

  4. 这对防止名称冲突几乎没有作用(也许什么也没有?)。 header 是否实例化此结构或 #define FOO_STRATEGY 没有区别。如果您在枚举/#define 值上使用良好的前缀,则包含该 header 的任何内容都有相同的名称冲突可能性。

关于c - 使用静态常量结构来限制 C 中常量的名称冲突有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28181419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com