【问题标题】:Redefining enum enumerators with #define [duplicate]使用#define [重复] 重新定义枚举枚举器
【发布时间】:2011-07-26 13:19:15
【问题描述】:

我在 C 头文件中发现了一些我无法弄清楚的内容。例如,在文件bits/socket.h 中有一个枚举类型 enum __socket_type,但在每个枚举数之后都有一个定义相同的宏定义。示例:

enum __socket_type
{
   SOCK_STREAM = 1,
   #define SOCK_STREAM SOCK_STREAM 
   ...
};

我一直无法弄清楚这是干什么用的。请赐教。我什至不知道如何形成正确的问题来查询谷歌或这个网站搜索框。

【问题讨论】:

    标签: c enums c-preprocessor


    【解决方案1】:

    预处理器宏永远不会递归扩展,因此#define 所做的就是将名称保留在任何使用它的位置。当您想要进行预处理器功能测试时,这些东西很有用。

    #ifdef SOCK_STREAM
    ..
    #endif
    

    可用于事后有条件地编译一些代码。

    编辑:因此,这结合了更简洁的枚举方法(没有冲突和范围的隐式值)与预处理器测试。

    【讨论】:

    • 确实,这有道理,但是为什么还有枚举不只是定义呢?
    • 我怕你这么说。 :P 做这样“通用”的事情常常让我的编程生活变得更加艰难......
    【解决方案2】:

    我唯一能想到的是因为人们看到一个全大写的常量,比如NUM_FILES,他们会认为这是一个宏并且很想写这个:

    #ifdef NUM_FILES
    

    现在通常这会失败,但如果您编写 #define NUM_FILES NUM_FILES,它会充当预处理器和 IDE 的宏以及代码本身的枚举。

    【讨论】:

      【解决方案3】:

      我怀疑是 IDE 或其他工具可以理解符号是以某种方式定义的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-31
        • 2016-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多