如何创建啥都不做的#define?

Posted

技术标签:

【中文标题】如何创建啥都不做的#define?【英文标题】:How to create #define that does nothing?如何创建什么都不做的#define? 【发布时间】:2017-10-27 15:05:04 【问题描述】:

我想使用#define 来锁定/解锁互斥锁。但是在我只使用单线程的其他平台上,我想禁用锁定和解锁并且什么都不做。

在这种情况下,如何在我不使用该功能的应用上安全地定义它?

例如,

#define SYS_LOCK sys_lock();
#define SYS_UNLOCK sys_unlock();

这是我在支持多线程的平台上使用的。

但我想在其他平台上禁用它。

这样定义是否安全,所以调用 SYS_LOCK 和 SYS_UNLOCK 什么都不做?

#define SYS_LOCK
#define SYS_UNLOCK

【问题讨论】:

是的,它是安全的。但是为什么你不想使用函数呢? 是的。那应该完全没问题。这也是通常标记头文件以避免重复或递归包含的方式。 定义末尾的分号格式错误。对于你的问题,我建议 Use #ifdefs and #define to optionally turn a function call into a comment的可能重复 最好将它们定义为#define SYS_LOCK() sys_lock()#define SYS_LOCK() 。这将使它们在代码中的使用看起来更自然。 【参考方案1】:

#define 只是声明该名称存在于预处理器中。 空#define 的概念不仅无害,它甚至被广泛使用,因为您可以测试宏是否已定义而无需关心其含义。

它主要用于启用或禁用导入文件中的某些功能。来自 pylon API 的简单示例(我碰巧在使用):

#   if defined(_WIN32) && !defined(_WIN64)
#       define PYLON_32_BUILD
#   elif defined(_WIN32) && defined(_WIN64)
#       define PYLON_64_BUILD
#   else
#       error unsupported wordsize (32/64 platform)
#   endif

此语句将决定是否包含 32 位或 64 位版本的 API

【讨论】:

以上是关于如何创建啥都不做的#define?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写一个在给定时间长度内啥都不做的函数? [复制]

Boost Spirit X3:跳过啥都不做的解析器

创建自己的 npx 命令 - 不运行/啥都不做

没有 else 或啥都不做的 SQL 查询案例?

为啥我的 Activity 在恢复时再次从顶部运行而不是啥都不做?

添加一个没有 Thread.sleep 的延迟和一个啥都不做的 while 循环