7

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

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. 为什么其他人不这样做?
4

3 回答 3

3

我看到四个可能的问题。如果你不在乎这些,那就去吧。

  1. 您将失去执行此示例的能力,其中枚举值用于“命名”数组中的索引,并且枚举中的最后一个条目自动给出数组大小。

    typedef enum {
       COLOR_RED,
       COLOR_GREEN,
       COLOR_BLUE,
       NUM_COLORS  
    } Color;
    
    
    int myPallete[NUM_COLORS];
    myPallete[COLOR_RED] = 0xf80000;
    

    可能还有其他方法可以使用 a#defineenum作为常量,以使您的方法在 C 中不起作用。这只是首先想到的。

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

  3. 没有其他人这样做,因此您正在创建的代码会使其他人第一次看到您的代码时绊倒,尽管我认为调整起来并不难。我不在乎你的意见在这里。如果多位评论员说这会令人困惑,那您已经把那些人弄糊涂了。

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

于 2015-01-27T23:10:03.897 回答
2

人们不这样做,因为这就是enum目的。

于 2015-01-27T22:50:24.880 回答
2

我想这会奏效,是的。但是,它会增加二进制大小(除非我们的朋友编译器优化掉了)。

我猜人们不使用它,因为使用格式正确的定义更容易。

#define FOO_STRATEGY_ALLOCATION_STATIC  1
#define FOO_STRATEGY_ALLOCATION_DYNAMIC 2

您也可以使用enum.

enum foo_strategy_allocation
{
 FOO_STRATEGY_ALLOCATION_STATIC = 1,
 FOO_STRATEGY_ALLOCATION_DYNAMIC = 2
};
于 2015-01-27T22:51:00.710 回答