gcc 预编译 header: 在主文件中编译指示一次

gcc precompiled header: pragma once in main file

我创建了一个 header 文件。简单的如下。

#pragma once

#include <iostream>

template<typename T>
void say(T t) {
    std::cout << t << std::endl;
}

然后使用 g++ 创建 gch pre-compiled header 和 g++ hello.h。它给了我这个警告 ->

pch.h:2:9: warning: #pragma once in main file
    2 | #pragma once
      |         ^~~~

但是创建的 gch 文件和 pre-compiled header 工作正常。如果我使用 header 守卫,这个错误就会消失。

我是不是做错了什么?

你没有做错任何事;这是一个 has been mentioned on the issue tracker before 的实施质量问题(但是,据我所知,目前没有改变行为的计划)。

在 Clang 中,您可以关闭针对特定编译器调用的警告(-Wno-pragma-once-outside-header);在 GCC 中,您现在只需要微笑着忍受它。

用于生成预编译的主要源文件header通常是一个made-up“间接”header,它只包含一堆#include 用于所有实际的headers 你想要预编译。 当您以这种方式使用机器时,主文件中不需要#pragma once(也没有保护),因此它可以按预期工作而没有警告。

这是一个已知的 GCC 错误:

据我所知,没有很好的方法来禁用此警告。保留匹配行为的一种方法是附加间接寻址。在pch.h中,使用

#include <pch-real.h>

(没有 #pragma once),并将实际的 header 包含在 pch-real.h 中。这主要保留了 include-only-once 优化,即使 <pch.h> 在 non-PCH 模式中多次包含也是如此。