【问题标题】:defines inside enum [duplicate]在枚举内部定义[重复]
【发布时间】:2012-10-02 10:32:06
【问题描述】:

在 linux 内核源代码中,我看到在 enums 中,还有一个与 enum 元素同名的定义。 linux/rtnetlink.h 中的示例我们有:

enum {
        RTM_BASE        = 16,
#define RTM_BASE        RTM_BASE

        RTM_NEWLINK     = 16,
#define RTM_NEWLINK     RTM_NEWLINK
        RTM_DELLINK,
#define RTM_DELLINK     RTM_DELLINK
...

这是什么原因?我不知道这是怎么用的。

谢谢

【问题讨论】:

    标签: c linux enums


    【解决方案1】:

    我能想到的一件事是,您可以通过宏检查枚举的 存在

    #ifdef RTM_BASE
    int flag = RTMBASE;
    #else
    int flag = 0;
    #endif
    

    不过,不知道是不是这样。

    【讨论】:

    • 是的,这正是我吃完三明治后要写的。这是我能看到它真正发挥作用的唯一目的
    • 有用!但是查看来源,似乎没有以这种方式使用定义。谢谢。
    • 在内核源代码中这样做是没有意义的,但在可能需要在多个内核版本上工作的用户空间应用程序中确实有意义,其中可能存在也可能不存在功能.
    • 您可以在例如ISC ntpd 来源isc.org/software/ntp
    【解决方案2】:

    这些#defines 实现的另一件事,除了允许旧代码在枚举常量名称更改时继续使用旧名称,并检查它们是否已定义之外,是防止其他代码定义这些符号。

    #include <linux/rtnetlink.h>
    // for some reason, the author thinks
    #define RTM_BASE 17.3f
    // is a good idea
    

    不会编译。

    【讨论】:

    • 我认为这个答案是正确的。其他两个答案在我看来相当做作。这有可能发现真正的、难以找到的名称冲突,而这种冲突很容易制造。
    【解决方案3】:

    另一个猜测:这个宏可以允许在不破坏其他代码的情况下重命名枚举的条目。改变

    enum {
            RTM_BASE        = 16,
    #define RTM_BASE        RTM_BASE
    

    enum {
            RTM_BASE_NEW_NEW_NEW        = 16,
    #define RTM_BASE        RTM_BASE_NEW_NEW_NEW
    

    用户仍然可以使用RTM_BASE

    【讨论】:

    • RTM_BASE = RTM_BASE_NEW_NEW_NEW 也可以,没有定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多