【发布时间】:2018-03-07 14:15:53
【问题描述】:
我有一个旧的 MCPP 项目,它被用作在机器上运行的 C++ 代码和在台式计算机上运行的 C# 之间的通信层。最近我们决定尝试杀死这个“胶水”项目。
该项目中有一些用于通信的常量列表,它们最好用作 C++ 和 C# 中的外部链接。
一位同事在使用以下技巧将常量的更改保存在一个地方之前曾做过类似的事情:
#if !__cplusplus
public const string
#else
static const TCHAR* const
#endif
XML_V1_TagRoot = "r";
__cplusplus 是根据编译器设置的,所以前置处理器让每个编译器看到它可以编译什么。
现在我遇到了一堆#define 类型的语句的问题:
#define TX_TAG2xHWID_PARAMETER _T("PR")
_T() 是一个宏。所以我尝试了以下方法:
#if __cplusplus
#define TX_TAG2xHWID_PARAMETER _T("PR")
#else
internal const string TX_TAG2xHWID_PARAMETER = "PR";
#endif
这不起作用,因为 C# 对定义没有价值。 source
然后我尝试了:
#if __cplusplus
#define TX_TAG2xHWID_PARAMETER \
#else
internal const string TX_TAG2xHWID_PARAMETER =
#endif
#if __cplusplus
_T(\
#endif
"PR"
#if __cplusplus
)
#else
;
#endif
这里的问题是 C# 不允许多行 #define。
基本上问题在于#define 本身就是一条预处理指令,但只有在文件在 C++ 项目中编译时才应执行。
我也尝试过让 C# 项目认为它是注释,将 /* 和 */ 放入不同的 #if,但我没有成功。
那么,有没有人知道如何让 C# 编译器不抱怨它不应该尝试编译的那一行?
【问题讨论】:
-
为什么你甚至试图将 c++ 和 c# 放在同一个文件中?你是想用另一个胶水项目杀死一个胶水项目吗?
-
我们偶尔会看到正确标记为 C 和 C++ 的代码';这可能是关于多语言 C++/C# 问题的第一个。
-
你是什么意思“这不起作用,因为 C# 对定义没有价值。” ?看来 C++ 会有一个#define TX_TAG2xHWID_PARAMETER,而 c# 会有一个
internal const string -
您真的创建过 Unicode 版本吗?如果没有,只需完全删除 _T() 宏。对于 MS 来说,它们是一个有用的 hack,可以在 MFC 等库中支持这两种类型,但它们不应该出现在用户代码中。
-
C# 没有预处理器,它只支持带有#if 的条件编译。您使用#if 测试的符号只能是项目设置。这不是您必须解决的问题,它只有一种字符串类型和一种语言语法。所以这些#defines 都不相关。
标签: c# c++ variadic-macros