【问题标题】:How to undefine system function-like macros?如何取消定义类似系统功能的宏?
【发布时间】:2017-04-07 14:36:58
【问题描述】:

我正在尝试构建一个定义方法howmany() 的代码。

在 OSX 中,/usr/include/sys/types.h 中有一个类似函数的同名宏

#define howmany(x, y)   __DARWIN_howmany(x, y)

a previous question 之后,我尝试在头文件中包含#undef

#ifdef howmany
#undef howmany /*undefining '/usr/include/sys/types.h' */
#endif

但类似函数的宏仍然处于活动状态。

/usr/include/sys/types.h:184:9: 注意:这里定义的宏 'howmany' #define howmany(x, y) __DARWIN_howmany(x, y) /* # y's == x bits? */

我应该如何停用这个类似函数的宏?

【问题讨论】:

  • 我刚刚试了一下,#include <sys/types.h> 之后的一个简单的#undef howmany 对我来说效果很好。
  • 这是非常脆弱的。是的,您可能可以让它工作,但是对导入内容的方式进行非常小的更改会导致它再次失败(或者更糟糕的是,只是调用了错误的代码)。您需要确保 #undef 包含在每个可能包含 types.h 的文件中,并且在定义后未定义。这是它可以打破的多种方式。重命名您的函数。这个名字被占用了。
  • @Rob Napier 请回答。这是一个很好的,我想投赞成票。我也希望这是一个已回答的问题,以便它脱离我的“答案:0”列表。 Q/A 对比 Q/评论对好得多。你是对的。

标签: macos clang c-preprocessor


【解决方案1】:

这是非常脆弱的。是的,您可能可以让它工作,但是对导入内容的方式进行非常小的更改会导致它再次失败(或者更糟糕的是,只是调用了错误的代码)。您需要确保 #undef 包含在每个可能包含 types.h 的文件中,并且在定义后未定义。这是它可以打破的多种方式。重命名您的函数。名字被占用了。

【讨论】:

  • 我接受这个答案,但最后我还是决定将代码中的所有函数都改名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多