使用 std::mutex 关闭头文件的 clr 选项
Posted
技术标签:
【中文标题】使用 std::mutex 关闭头文件的 clr 选项【英文标题】:Turn off clr option for header file with std::mutex 【发布时间】:2015-07-11 16:18:43 【问题描述】:我有一个 Visual Studio 项目,其中包含具有托管代码的文件和具有非托管代码的文件。该项目支持 CLR,但是当我添加一个不需要 .NET 的文件时,我只需通过右键单击该文件来关闭 /crl 选项:
我添加了一个必须包含非托管代码并使用 std::mutex 的类。
// Foo.h
class Foo
std::mutex m;
编译后出现如下错误:
error C1189: #error : 编译时不支持 /clr 或 /clr:pure。
问题是我没有选择关闭头文件 (.h) 的 clr,因为这是我右键单击 .h 文件时的窗口:
我该如何解决这个问题?
【问题讨论】:
我的水晶球说把这个类放在 .h 文件中不是一个好主意。因为您还 #include 了一个 .cpp 文件,该文件正在使用 /clr 进行编译。避免使用接口暴露类内部。 @HansPassant 是的,我有包含 Foo.h 的 .cpp 文件。我应该在哪里 exaclty 将 cpp 文件中包含的所有类移动到我禁用 clr 选项的位置? 【参考方案1】:可以使用称为Pointer To Implementation (pImpl) idiom 的解决方法。
下面是一个简单的例子:
// Foo.h
#include <memory>
class Foo
public:
Foo();
// forward declaration to a nested type
struct Mstr;
std::unique_ptr<Mstr> impl;
;
// Foo.cpp
#include <mutex>
struct Foo::Mstr
std::mutex m;
;
Foo::Foo()
: impl(new Mstr())
【讨论】:
以上是关于使用 std::mutex 关闭头文件的 clr 选项的主要内容,如果未能解决你的问题,请参考以下文章
C++11:互斥锁std::mutex和std::lock_guard/std::unique_lock
C++11:互斥锁std::mutex和std::lock_guard/std::unique_lock
std::mutex 锁定函数和 std::lock_guard<std::mutex> 的区别?