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 模式中多次包含也是如此。
我创建了一个 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 模式中多次包含也是如此。