避免警告:在‘上操作;计数’;可能未定义[-Wsequence point] 我正在使用No.js N-API,我做了一个小包装,使出口C++功能变得容易。 template<class T, class... Targs> napi_value Api::create(const char* name, T (* const cb)(Targs...)) { // creates JavaScript function that will call cbProxy<> when called return create(name, cbProxy<T, Targs...>, cb); } template<class T, class... Targs> napi_value Api::cbProxy(const napi_env env, const napi_callback_info info) { // number of arguments size_t count = sizeof...(Targs); ApiValue args[count]; T (* cb)(Targs...); // retrieve arguments and callback if (!Api::getParams(env, info, args, count, &cb)) return nullptr; T ret = cb(Api::getValue<Targs>(&args[--count])...); return Api(env).create(ret); } template<> bool Api::getValue(ApiValue* value) { return value->toBool(); } template<> double Api::getValue(ApiValue* value) { return value->toDouble(); } template<> int32_t Api::getValue(ApiValue* value) { return value->toInt32(); }

避免警告:在‘上操作;计数’;可能未定义[-Wsequence point] 我正在使用No.js N-API,我做了一个小包装,使出口C++功能变得容易。 template<class T, class... Targs> napi_value Api::create(const char* name, T (* const cb)(Targs...)) { // creates JavaScript function that will call cbProxy<> when called return create(name, cbProxy<T, Targs...>, cb); } template<class T, class... Targs> napi_value Api::cbProxy(const napi_env env, const napi_callback_info info) { // number of arguments size_t count = sizeof...(Targs); ApiValue args[count]; T (* cb)(Targs...); // retrieve arguments and callback if (!Api::getParams(env, info, args, count, &cb)) return nullptr; T ret = cb(Api::getValue<Targs>(&args[--count])...); return Api(env).create(ret); } template<> bool Api::getValue(ApiValue* value) { return value->toBool(); } template<> double Api::getValue(ApiValue* value) { return value->toDouble(); } template<> int32_t Api::getValue(ApiValue* value) { return value->toInt32(); },c++,c++11,templates,variadic-templates,C++,C++11,Templates,Variadic Templates,这可以100%正常工作,但会触发编译器警告。对于C++,我有点新手,所以我在寻找一个更好的方法来写这个。 基本上,我想一次遍历数组args和类型参数列表targets 只是澄清一下:扩展函数调用中的--count会触发以下警告: 警告:对“count”的操作可能未定义[-wsequencepoint]我想问题在于 int ret = cb(Api::getValue<bool>(&args[--count]), Api::getValue<d

这可以100%正常工作,但会触发编译器警告。对于C++,我有点新手,所以我在寻找一个更好的方法来写这个。 基本上,我想一次遍历数组
args
和类型参数列表
targets

只是澄清一下:扩展函数调用中的
--count
会触发以下警告:

警告:对“count”的操作可能未定义[-wsequencepoint]
我想问题在于

int ret = cb(Api::getValue<bool>(&args[--count]), 
             Api::getValue<double>(&args[--count]));


如果您使用的是C++11,那么模拟
std::index_sequence
std::make_index_sequence
并不是很难。

警告是…?@max66,正如标题所述,“警告:对‘计数’的操作可能未定义[-wsequencepoint]”下次可能会重复,只要您发现自己在说什么“工作100%很好,但是……”我希望你的第二个想法是“不。肯定是出了什么问题。“但最好不要忽略警告。@NickyC它依赖于未定义的行为,因此它是100%错误的,但我无法找到另一种方法。我认为评估的顺序会产生问题。感谢您提供了非常简洁的解决方案!原始代码在C++17之前是未定义的行为;在C++17中,它被更改为“未指定”,其行为与您的相同describe@Smokey-不客气。回答有点改进(美学上改进):
std::index\u sequence\u for
而不是
std::make\u index\u sequence
@M-你是对的:未定义的行为;我确信它依赖于实现。纠正;谢谢
int ret = cb(Api::getValue<bool>(&args[--count]), 
             Api::getValue<double>(&args[--count]));
int ret = cb(Api::getValue<bool>(&args[1]), 
             Api::getValue<double>(&args[0]));
int ret = cb(Api::getValue<bool>(&args[0]), 
             Api::getValue<double>(&args[1]));
template <typename T, typename ... Targs, std::size_t ... Is>
napi_value Api::cbProxyHelper (const napi_env env,
                               const napi_callback_info info,
                               std::index_sequence<Is...> const &)
 {
   // number of arguments
   constexpr std::size_t count = sizeof...(Targs);
   ApiValue args[count];
   T (* cb)(Targs...);
   // retrieve arguments and callback
   if (!Api::getParams(env, info, args, count, &cb))
      return nullptr;

   T ret = cb(Api::getValue<Targs>(&args[count-1U-Is])...);    
   return Api(env).create(ret);
 }

template <typename T, typename ... Targs>
napi_value Api::cbProxy (const napi_env env, const napi_callback_info info)
 { return cbProxyHelper(env, info, std::index_sequence_for<Targs...>{}); }