使用 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++关于锁的总结

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> 的区别?

将 std::thread 与 std::mutex 一起使用

c++ 如何将 std::mutex 和 std::lock_guard 与仿函数一起使用?