【问题标题】:how can C++ macro use for two string literalC ++宏如何用于两个字符串文字
【发布时间】:2013-01-24 07:01:04
【问题描述】:

我以前用过这些宏:

#define TEXT_A   _T("a")
#define TEXT_B   _T("b")

std::wstring text = TEXT_A TEXT_B;      // then text = "ab"

现在我该怎么做:

#define TEXT_A   "a"
#define TEXT_B   "b"
std::wstring text = _T(TEXT_A TEXT_B);     // i need text be "ab" but failed.  and that error is wchar_t cannot connect with char.

我正在寻找一个宏来做到这一点。

【问题讨论】:

  • 我需要 marco,因为我有很多 const 字符串。而且我不想打错字。
  • 我尝试了 boost::preproceesor,但它需要我的字符串 marco 和 ()。它将被视为一个序列。然后使用 BOOST_PP_SEQ_FOR_EACH 连接。但它很复杂。
  • 请注意,有点讽刺的是,_T(TEXT_A TEXT_B); 可以在 GCC 中工作,因为它会扩展为 L"a" "b"(假设 _T() 是针对宽字符),并且当只有一种文字时,GCC 会正确实现字符串文字连接有一个 L 前缀。但是,MSVC 没有,所以它会被 error C2308 覆盖。

标签: c++ visual-c++ text literals


【解决方案1】:

使用

std::wstring text = _T(TEXT_A) _T(TEXT_B);

更好的解决方案:stop using wstring

【讨论】:

  • 谢谢。但是如果我有一个 marco #define TEXTAB TEXT_A TEXTB.\n 那么 _T(TEXTAB) 会出现错误。顺便说一句,我如何在评论中输入新行。 “输入”不起作用。
  • @tnntnn:那你不能在编译时做。马克是对的,停止使用宏...并使用多行cmets `* ... *`来做多行cmets!
  • @ybungalobill:哦。谢谢你的提示,我没有注意到评论。任何没有 marco 的解决方案来处理相同的字符串文字
  • @tnntnn:正如我所说,在您描述的情况下,您必须在运行时使用MultiByteToWideChar 函数之类的东西进行转换。
  • @tnntnn:您只在 "" 字符串文字周围使用 _TTEXTAB 不是字符串文字,所以你不应该写 _T(TEXTAB)
猜你喜欢
  • 2011-01-12
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 2021-10-04
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多