【问题标题】:C++ Macros with multiple statements具有多个语句的 C++ 宏
【发布时间】:2014-12-30 07:48:08
【问题描述】:

我正在从 sourceforge 分析 FileTransfer 开源项目的源代码。我是 C++ 新手,遇到了以下宏:

#define USES_CONVERSION int _convert; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw; (_lpw); LPCSTR _lpa; (_lpa)

我了解预处理器在简单宏中完成替换的基本思想,例如:

#define PI 3.14

但我不理解上面显示的长宏(第一个)。有人会解释一下吗?

【问题讨论】:

  • 这真的不难,预处理器主要进行与编程语言(此处为 C++)无关的文本替换,因此它只是将 USES_CONVERSION 扩展到它看到该标记的任何地方,并在 @ 上跟随它的整个文本987654324@ 行,就像复制粘贴一样。

标签: c++ replace macros c-preprocessor


【解决方案1】:

它只是替换了他的出现

USES_CONVERSION

用代码

int _convert; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw; (_lpw); LPCSTR _lpa; (_lpa) 

这只是一个简单的文本替换

【讨论】:

  • 那么(_convert);的含义是什么?谢谢
  • 这是一个 C/C++ 技巧,用于避免未使用已声明变量的警告。 (另外对于添加断点很有用)。
【解决方案2】:

换句话说,就是一个宏函数。并且可以在有人用C语言用C#语言实现getter和setter的情况下使用。

但在 c++ 语言中,我们不推荐这种用法,因为它不容易理解。

【讨论】:

    【解决方案3】:

    该宏是 ATL 库的一部分,在 atlmfc\include\atlconv.h 中定义,它创建局部变量,供 atlconv.h 中定义的其他宏使用,如 A2W、W2A。 其目的是为不同类型的字符数组(ansi、widechars)之间的转换提供方便的方法。

    【讨论】:

      猜你喜欢
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多