使用静态常量结构来限制 C 中常量的名称冲突有什么问题吗?
Is there anything wrong with using static const structs to limit name collisions of constants in C?
例如,如果我要在 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);
我想我有一个 two-part 问题:
- 这项工作是否符合预期?
- 为什么其他人不这样做?
人们不这样做,因为那是 enum
的目的。
我想这行得通,是的。但是,它会增加二进制文件的大小(除非我们的编译器朋友对其进行了优化)。
我猜人们不会使用它,因为使用格式正确的定义更容易。
#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
};
我看到四个可能的问题。如果你不关心这些,那就去吧。
你失去了做这个例子的能力,其中枚举值用于 "name" 索引到数组中,枚举中的最后一个条目自动给出数组大小。
typedef enum {
COLOR_RED,
COLOR_GREEN,
COLOR_BLUE,
NUM_COLORS
} Color;
int myPallete[NUM_COLORS];
myPallete[COLOR_RED] = 0xf80000;
您可能还有其他方法可以使用 #define
或 enum
作为常量,这样您的方法在 C 中不起作用。这只是第一个记.
以这种方式在 header 中声明结构会将结构的 副本 放入每个生成的 object 文件中。浪费的内存使得这对深度嵌入式系统不友好,在深度嵌入式系统中,每个 object 文件浪费 5 个字节或 RAM 会很糟糕。将你的结构放在一个“.c”文件中并在 header 中用 extern 声明它可能会有所帮助。
没有其他人这样做,所以您创建的代码 会 绊倒其他人第一次看您的代码,尽管我想不会很难调整。我不在乎你在这里有什么看法。如果多个评论员说这会令人困惑,那么您已经让那些人感到困惑了。
这对防止名称冲突几乎没有作用(也许什么都没有?)。 header 实例化此结构或实例化 #define FOO_STRATEGY
没有区别。如果您在枚举/#define 值上使用良好的前缀,则包含 header 的任何内容都有相同的名称冲突可能性。
例如,如果我要在 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);
我想我有一个 two-part 问题:
- 这项工作是否符合预期?
- 为什么其他人不这样做?
人们不这样做,因为那是 enum
的目的。
我想这行得通,是的。但是,它会增加二进制文件的大小(除非我们的编译器朋友对其进行了优化)。
我猜人们不会使用它,因为使用格式正确的定义更容易。
#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
};
我看到四个可能的问题。如果你不关心这些,那就去吧。
你失去了做这个例子的能力,其中枚举值用于 "name" 索引到数组中,枚举中的最后一个条目自动给出数组大小。
typedef enum { COLOR_RED, COLOR_GREEN, COLOR_BLUE, NUM_COLORS } Color; int myPallete[NUM_COLORS]; myPallete[COLOR_RED] = 0xf80000;
您可能还有其他方法可以使用
#define
或enum
作为常量,这样您的方法在 C 中不起作用。这只是第一个记.以这种方式在 header 中声明结构会将结构的 副本 放入每个生成的 object 文件中。浪费的内存使得这对深度嵌入式系统不友好,在深度嵌入式系统中,每个 object 文件浪费 5 个字节或 RAM 会很糟糕。将你的结构放在一个“.c”文件中并在 header 中用 extern 声明它可能会有所帮助。
没有其他人这样做,所以您创建的代码 会 绊倒其他人第一次看您的代码,尽管我想不会很难调整。我不在乎你在这里有什么看法。如果多个评论员说这会令人困惑,那么您已经让那些人感到困惑了。
这对防止名称冲突几乎没有作用(也许什么都没有?)。 header 实例化此结构或实例化
#define FOO_STRATEGY
没有区别。如果您在枚举/#define 值上使用良好的前缀,则包含 header 的任何内容都有相同的名称冲突可能性。