编译器看不到 C++11 标识符

分享于2022年07月17日 c++ c++11 googletest visual-studio 问答
【问题标题】:编译器看不到 C++11 标识符(Compiler doesn't see the C++11 identifiers)
【发布时间】:2022-01-27 20:56:19
【问题描述】:

当我尝试构建 Google 测试 c++ 项目时,我发现了错误

Error   C3861   't1': identifier not found
Error   C2065   't1': undeclared identifier
Error   C2039   'thread': is not a member of 'std'
Error   C2065   'thread': undeclared identifier
Error   C2146   syntax error: missing ';' before identifier 't1'

我的测试代码是:

#include 
#include 

#include "pch.h"
TEST(...)
{
    // preconditions here

    std::thread t1([&] {
        Sleep(100);
        testee.enqueue(item);
        });
    
    t1.join();
    
    // other logic
}

为什么我不能在我的项目中使用 std::thread 和其他 C++11 功能?我该怎么做?

  • #include <thread> 了吗?哪个版本的视觉工作室?哪些编译器标志?
  • @mch 是的,我做了 #include <thread> 。我使用 Visual Studio 2017。在哪里可以看到 VS 2017 中的编译器标志?
  • @AlanBirtles,希望我按照你的意愿编辑
  • Visual Studio 2017 支持 C++14(默认)或 C++17 标准。它不支持旧标准,所以 <thread> 肯定是众所周知的。正如@273K 回答的那样,问题是由预编译的标头引起的。

【解决方案1】:

#include "pch.h" 必须是第一个。 #include "pch.h" 之前的其他 #include 指令将被忽略。

  • 确实如此。 #include "pch.h" 之前的 Everything 会被 MSVC 编译器忽略(使用 /Yu"pch.h" 编译器选项)。这包括 #include #define 、类声明,甚至像随机文本这样的语法错误!我被抓了几次,所以我现在用一个 Git 钩子强制执行每个 .cpp #include "pch.h" 开头。
  • 不错的评论!我从来没有遇到过这样的麻烦,因为我从来没有在#include 之前添加过代码。欢迎您修改我的答案或添加您自己的答案。