首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于枚举的宏的用途

用于枚举的宏的用途
EN

Stack Overflow用户
提问于 2014-02-18 13:28:39
回答 2查看 477关注 0票数 14

我的Linux系统上的一个头socket.h如下所示。

代码语言:javascript
复制
/* Bits in the FLAGS argument to `send', `recv', et al.  */
enum
  {
    MSG_OOB             = 0x01, /* Process out-of-band data.  */
#define MSG_OOB         MSG_OOB
    MSG_PEEK            = 0x02, /* Peek at incoming messages.  */
#define MSG_PEEK        MSG_PEEK
    MSG_DONTROUTE       = 0x04, /* Don't use local routing.  */
#define MSG_DONTROUTE   MSG_DONTROUTE
...

定义enum是一种idiom for creating type-safe-ish constants in C,语言实际上将其视为编译时常量。

我的问题是:宏MSG_OOBMSG_PEEK、…的定义是什么?扩展到他们自己的服务?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-18 13:40:49

POSIX标准要求“符号常量”(如MSG_DONTROUTE )是“类似对象的宏”,而不是枚举数。将它们定义为自己允许在枚举的上下文中使用它们,以及正确地处理(例如,#ifdef )。

来自POSIX标准:

标头将定义以下符号常量.MSG_DONTROUTE

和:

象征常数..。引用C预处理符号(也没有参数)。

最后,从附录中得出:

如果一个常量被要求为宏,但也被允许为另一种类型的常量,例如枚举常量,那么对于将其定义为另一种类型的常量的实现,宏通常定义如下: #define macro_name macro_name 这允许应用程序使用#ifdef等来确定是否定义了宏,但是宏在#if预处理器指令中是不可用的,因为预处理器将未展开的单词macro_name视为值为零。

票数 8
EN

Stack Overflow用户

发布于 2014-02-18 13:42:01

这些定义的目的是,应用程序可以执行以下操作

代码语言:javascript
复制
#ifdef MSG_OOB
  some code here
#endif

宏的扩展不是递归的,因此宏MSG_OOB的计算结果是相同名称的enum常量MSG_OOB

将常量声明为enum也有帮助,例如,在调试时。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21855326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档