Немного похоже на самый первый ответ ...
public static Function<Integer,Double> factorial;
static {
factorial = n -> {
assert n >= 0;
return (n == 0) ? 1.0 : n * factorial.apply(n - 1);
};
}
Мне удалось получить предварительно скомпилированные заголовки, работающие под gcc однажды в прошлом, и я вспоминаю проблемы наличия тогда также. Вещь помнить состоит в том, что gcc проигнорирует файл (header.h.gch или подобный), если определенные условия не будут соблюдены, список которого может быть найден на , gcc обычно предварительно компилировал страницу .
документации заголовка, является самым безопасным иметь Вашу компиляцию системы сборки .gch файл как первый шаг с теми же параметрами командной строки и исполняемым файлом как остальная часть Вашего источника. Это гарантирует, что файл актуален и что нет никаких тонких различий.
Это - вероятно, также хорошая идея получить его работающий с изобретенным примером сначала, только удалить возможность, что Ваши проблемы характерны для исходного кода в Вашем проекте.
Назовите gcc тем же путем, как Вы называете его для своего исходного файла, но с заголовочным файлом.
, например,
g++ $(CPPFLAGS) test.h
это генерирует файл, названный test.h.gch
Каждый раз gcc поиски test.h, он сначала ищет test.h.gch и если он находит его, он использует его автоматически.
[еще 116] информация может быть найдена под GCC Предварительно скомпилированные Заголовки
Во-первых, посмотрите документацию здесь .
Вы компилируете заголовки так же, как и любой другой файл, но вы помещаете вывод в файл с суффиксом .gch
.
Так, например, если вы предварительно скомпилируете stdafx.h, у вас будет предварительно скомпилированный заголовок, который будет автоматически найден под именем stdafx.h.gch
каждый раз, когда вы включаете stdafx.h
Пример:
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 после шага 1.
Я определенно добился успеха. Сначала я использовал следующий код:
#include <boost/xpressive/xpressive.hpp>
#include <iostream>
using namespace std;
using namespace boost::xpressive;
//A simple regex 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;
}
Это был просто привет от Boost Xpressive (см. Ссылку ниже). Сначала я скомпилировал с параметром -H
в gcc. Он показал огромный список используемых заголовков. Затем я взглянул на флаги компиляции, которые создавала моя IDE (code :: blocks), и увидел что-то вроде этого:
g ++ -Wall -fexceptions -g -c main.cpp -o obj / Debug / main.o
Итак, я написал команду для компиляции файла Xpressive.hpp с точно такими же флагами:
sudo g ++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp
I снова скомпилировал исходный код с помощью -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
The! означает, что компилятор смог использовать предварительно скомпилированный заголовок. Значок x означает, что он не смог его использовать. Использование соответствующих флагов компилятора имеет решающее значение. Я снял -H и провел несколько тестов скорости. Предварительно скомпилированный заголовок улучшился с 14 до 11 секунд. Неплохо, но не отлично.
Примечание. Вот ссылка на пример: http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples I не мог заставить его работать в почте.
Кстати: я использую следующий g ++
g ++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3