#include <boost/xpressive/xpressive.hpp>
#include <iostream>
using namespace std;
using namespace boost::xpressive;
// A simple regular expression test
int main()
{
std::string hello("Hello, World!");
sregex rex = sregex::compile( "(\\w+) (\\w+)!" );
smatch what;
if( regex_match( hello, what, rex ) )
{
std::cout << what[0] << '\n'; // Whole match
std::cout << what[1] << '\n'; // First capture
std::cout << what[2] << '\n'; // Second capture
}
return 0;
}
-H
选项进行编译。它显示了一个使用的头文件巨大的列表。然后,我查看了我的 IDE(Code::Blocks)生成的编译标志,并看到类似于这样的内容:g++ -Wall -fexceptions -g -c main.cpp -o obj/Debug/main.o
sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp
-H
重新编译了原始代码,得到了以下输出:g++ -Wall -fexceptions -H -g -c main.cpp -o obj/Debug/main.o
! /usr/local/include/boost/xpressive/xpressive.hpp.gch
main.cpp
. /usr/include/c++/4.4/iostream
.. /usr/include/c++/4.4/x86_64-linux-gnu/bits/c++config.h
.. /usr/include/c++/4.4/ostream
.. /usr/include/c++/4.4/istream
main.cpp
您可以像编译其他文件一样编译头文件,但需要将输出放在一个后缀名为.gch
的文件中。
例如,如果您预编译了stdafx.h,则会生成一个预编译头文件,每次包含stdafx.h时都会自动搜索名为stdafx.h.gch
的文件。
示例:
stdafx.h:
#include <string>
#include <stdio.h>
a.cpp:
:#include "stdafx.h"
int main(int argc, char**argv)
{
std::string s = "Hi";
return 0;
}
然后按照以下方式进行编译:
> g++ -c stdafx.h -o stdafx.h.gch
> g++ a.cpp
> ./a.out
即使在第一步之后删除stdafx.h,您的编译也将正常工作。
-x
指定C++预编译头文件的选项应该是-x c++-header
而不是-x c++
。以下是使用PCH的示例。
pch.h
:
// Put your common include files here: Boost, STL as well as your project's headers.
main.cpp
:
#include "pch.h"
// Use the PCH here.
按照以下方式生成PCH:
$ g++ -x c++-header -o pch.h.gch -c pch.h
pch.h.gch
文件必须与 pch.h
文件在同一个目录下才能使用,因此请确认你在 pch.h
文件所在的目录中执行上述命令。
-c pch.h
而不是 -c pch.cpp
,对吗? - M.M使用与为源文件调用GCC相同的方式来调用它,只不过需要加上头文件。
例如:
g++ $(CPPFLAGS) test.h
这将生成一个名为test.h.gch的文件。
每次GCC搜索test.h时,它首先查找test.h.gch,如果找到了它,就自动使用它。
更多信息可在GCC预编译头文件中找到。
请确保-include your_header.h
这是我如何预编译并使用bits/stdc++.h
集合的方式。
代码
#include <bits/stdc++.h>
然后我通过使用-H编译我的文件并查看输出来定位库。
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
这是我看到的地方
. /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h
我在当前目录下创建了一个名为bits
的新文件夹,并从中复制了stdc++.h
。
然后我运行了
g++ bits/stdc++.h -O3 -std=c++14 -pthread
生成bits/stdc++.gch
的方式如下:
通常情况下,我会通过以下方式编译我的代码:
g++ sol.cpp -O3 -pthread -lm -std=c++14 -o executable
但我必须对此进行修改
g++ sol.cpp -include bits/stdc++.h -O3 -pthread -lm -std=c++14 -o executable
当使用 -include bits/stdc++.h
时,它仅解析为 .gch
文件,而不是 .h
文件,这对我来说很关键。还要记住的是,您必须将 *.h
头文件编译成几乎与编译 *.cpp
相同的参数。当我没有包含 -O3
或 -pthread
时,它会忽略 *.gch
预编译头文件。
为了检查一切是否正确,您可以通过比较以下结果来测量时间差异:
time g++ sol.cpp ...
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
再次查找头文件路径,如果你现在在库路径之前看到!
,例如:
! ./bits/stdc++.h.gch
....
.gch
扩展名,而不是替换 .h
。如果你弄错了,编译器将无法找到它并且默默地不起作用。
precomp.h => precomp.h.gch而不是:
precomp.h => precomp.gch使用 GCC 的
-H
选项来检查是否找到/使用它。