Как и сказал Ибам, engineStrict
теперь устарел. Но я нашел это решение:
check-version.js:
import semver from 'semver';
import { engines } from './package';
const version = engines.node;
if (!semver.satisfies(process.version, version)) {
console.log(`Required node version ${version} not satisfied with current version ${process.version}.`);
process.exit(1);
}
package.json:
{
"name": "my package",
"engines": {
"node": ">=50.9" // intentionally so big version number
},
"scripts": {
"requirements-check": "babel-node check-version.js",
"postinstall": "npm run requirements-check"
}
}
Узнайте больше здесь: https://medium.com/@adambisek/how-to-check-minimum-required-node-js-version-4a78a8855a0f#.3oslqmig4
.nvmrc
И еще одна вещь ... dotfile «.nvmrc» может использоваться для запроса определенной версии узла (но я еще не пробовал ее) - https: // github.com/creationix/nvm#nvmrc
Хорошо разработанный C callback API позволяет передавать значение в функцию обратного вызова. Это позволяет вам иметь обратные вызовы с отслеживанием состояния.
В этом случае union sigval
является объединением int
и void*
. Вы должны придерживаться своего состояния в любом из этих двух.
std::function<Sig>
может хранить состояние, поэтому вам нужно передать это состояние.
A std::function
не является указателем на функцию. Для того, чтобы передать его в API обратного вызова функции C, вам нужно обернуть его и передать как часть void*
.
struct sig_cb {
void(* function)(sigval_t);
void* pvoid;
};
sig_cb make_signal_callback( std::function<void()>* pf ) {
return {
[](sigval_t v) { (*static_cast<std::function<void()>*>(v.sival_ptr))(); },
pf
};
}
, затем измените ваш код:
functionCbType callcbk;
...
struct sigevent se;
auto cb = make_signal_callback(&callcbk);
se.sigev_notify = SIGEV_THREAD;
se.sigev_notify_function = cb.function;
se.sigev_value.sival_ptr = cb.pvoid;
se.sigev_notify_attributes = NULL;
int status = timer_create(CLOCK_MONOTONIC, &se, &timer_id);
и он должен работать. Естественно, жизнь вашего std::function
должна управляться отдельно.
Структуры sigevent
sigev_notify_function
не ожидают объект std::function
, он ожидает указатель функции:
void (*sigev_notify_function) (union sigval);
Объект std::function
может быть создан неявно из указателя функции, но обратное невозможно. Вы должны использовать указатель на фактическую функцию.
Этого можно добиться, используя callcbk.target<void(*)(union sigval)>()
, чтобы получить указатель на исходный указатель функции, но тогда callcbk
несколько бессмысленно.