gcc预编译头文件:pragma出现在主文件中

时间:2019-06-12 13:42:16

标签: c++ g++ pragma precompiled-headers

我创建了头文件。简单一些如下。

#pragma once

#include <iostream>

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

,然后使用g++gch创建g++ hello.h预编译头。它给了我这个警告->

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

但是创建的gch文件和预编译的头文件可以正常工作。如果使用标题保护,则该错误消失。

我在这里做错什么了吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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