【问题标题】:"Define" Macro Concatenation and _TEXT“定义”宏连接和 _TEXT
【发布时间】:2011-06-03 09:45:57
【问题描述】:

在 c++(ms 编译器)中有没有连接 #define 宏的方法?

我有这样的现有代码:

#define LOG_FILENAME _TEXT("VendorBlaBlaDriver.log")
#define REGISTRY_FILENAME _TEXT("VendorBlaBlaDriver")
#define VENDOR_NAME _TEXT("VendorBlaBla")

我想做以下事情:

#define NAME_PART1 "VenorBlaBla"
#define NAME_PART2 "Driver"

#define LOG_FILENAME _TEXT(NAME_PART1 NAME_PART2 ".log")
#define REGISTRY_FILENAME _TEXT(NAME_PART1 NAME_PART2)
#define VENDOR_NAME _TEXT(NAME_PART1)

但是编译器给了我一个错误:

error C2308: concatenating mismatched strings

有什么方法可以做到这一点吗?问题是这是一个组件,我想稍后为编译器指定 -D 选项。我不想将 NAME_PART1 和 NAME_PART2 存储在源代码中。

【问题讨论】:

  • 不,那里没有 _TEXT 宏
  • 您可以简单地键入 #define LOG_FILENAME NAME_PART1 NAME_PART2 ".log" 还是我遗漏了什么?
  • 提示:如果您遵循建议并多次使用_TEXT,您可以使用简短的_T 宏,该宏扩展为相同。

标签: c++


【解决方案1】:

您不能两次应用 _TEXT 宏。或多个字符串,但您可以连接结果。 IE。

#define LOG_FILENAME _TEXT(NAME_PART1) _TEXT(NAME_PART2) _TEXT(".log")

但是,您真的不应该打扰。 _TEXT 宏在世纪之交前后被使用,当时仍然存在非 Unicode 平台。今天我们只写#define NAME_PART1 L"VenorBlaBla";没有人再销售 Windows 95 软件了。

【讨论】:

    【解决方案2】:

    这是因为 _TEXT 只应用于 NAME_PART1,而不是其他部分,这应该写成:

    #define NAME_PART1 "VenorBlaBla"
    #define NAME_PART2 "Driver"
    
    #define LOG_FILENAME      _TEXT(NAME_PART1) _TEXT(NAME_PART2) _TEXT(".log")
    #define REGISTRY_FILENAME _TEXT(NAME_PART1) _TEXT(NAME_PART2)
    #define VENDOR_NAME       _TEXT(NAME_PART1)
    

    不匹配是 _TEXT 定义了一个宽字符串,而其他字符串仍然是普通字符串。

    【讨论】:

      【解决方案3】:

      这行不通(还没有编译器可以尝试):

      #define LOG_FILENAME _TEXT(NAME_PART1) _TEXT(NAME_PART2) _TEXT(".log")
      

      然后让编译器连接两个字符串。

      【讨论】:

        猜你喜欢
        • 2015-08-02
        • 1970-01-01
        • 2020-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 2013-10-21
        相关资源
        最近更新 更多