'va_start' 用于具有固定参数错误的函数
'va_start' used in function with fixed args error
我的 nullPointcheck 函数:
template<typename T, typename... Args>
bool __nullPointCheck(T first, Args... args)
{
bool ret = true;
va_list vl;
auto n = sizeof...(args);
va_start(vl, n);
for (auto i = 0; i <= n; ++i)
{
auto p = va_arg(vl, T);
if (!p)
{
ret = false;
}
}
va_end(vl);
return ret;
}
但我收到如下 ndk 构建错误:
'va_start' used in function with fixed args
va_start(vl, n);
当我将 va_start 中的第二个参数更改为第一个参数时,如下所示:
va_start(vl, first);
ndk-build导出报错如下:
'va_start' used in function with fixed args
va_start(vl, first);
^
E:/ANDROID_HOME/android-ndk-r10c/toolchains/llvm-3.5/prebuilt/windows-x86_64/bin
\..\lib\clang.5\include\stdarg.h:33:29: note:
expanded from macro 'va_start'
#define va_start(ap, param) __builtin_va_start(ap, param)
vs2013没有错误,但是代码无法通过ndk-build阶段
我的可以通过编译阶段的解决方案如下:
template<typename T, typename... Params, std::size_t N = sizeof...(Params)>
static bool nullPointCheck(Params... params)
{
std::array<T, N> arr = { params... };
for (auto point : arr)
{
if (!point)
{
return false;
}
}
return true;
}
va_start
等只能用在原型以 ...);
结尾的函数中。这与参数包不同。您的代码使用参数包。使用参数包的语法与可变参数函数的语法不同。
我假设你的函数应该 return true
当且仅当所有参数都是非空指针时。实现您的功能的一种方法是:
inline constexpr bool nullPointCheck() { return true; }
template<typename T, typename... Args>
constexpr bool nullPointCheck(T&& first, Args&&... args)
{
return first && nullPointCheck(args...);
}
rontgen的回答也不错
您实际上可以使用此函数来检查任意参数列表是否全部 true
。我使用了通用引用,这样就不会对参数进行复制;这对指针没有影响,但可能对更复杂的类型有影响。
要将函数限制为仅接受指针,请将 T&&
更改为 T *
。 (保持 Args&&
不变)。如果你还想接受文字 nullptr
那么你还需要一个重载:
inline constexpr bool nullPointCheck(std::nullptr_t) { return false; }
因为nullptr
实际上并没有推导出任何T *
。
我的 nullPointcheck 函数:
template<typename T, typename... Args>
bool __nullPointCheck(T first, Args... args)
{
bool ret = true;
va_list vl;
auto n = sizeof...(args);
va_start(vl, n);
for (auto i = 0; i <= n; ++i)
{
auto p = va_arg(vl, T);
if (!p)
{
ret = false;
}
}
va_end(vl);
return ret;
}
但我收到如下 ndk 构建错误:
'va_start' used in function with fixed args
va_start(vl, n);
当我将 va_start 中的第二个参数更改为第一个参数时,如下所示:
va_start(vl, first);
ndk-build导出报错如下:
'va_start' used in function with fixed args
va_start(vl, first);
^
E:/ANDROID_HOME/android-ndk-r10c/toolchains/llvm-3.5/prebuilt/windows-x86_64/bin
\..\lib\clang.5\include\stdarg.h:33:29: note:
expanded from macro 'va_start'
#define va_start(ap, param) __builtin_va_start(ap, param)
vs2013没有错误,但是代码无法通过ndk-build阶段
我的可以通过编译阶段的解决方案如下:
template<typename T, typename... Params, std::size_t N = sizeof...(Params)>
static bool nullPointCheck(Params... params)
{
std::array<T, N> arr = { params... };
for (auto point : arr)
{
if (!point)
{
return false;
}
}
return true;
}
va_start
等只能用在原型以 ...);
结尾的函数中。这与参数包不同。您的代码使用参数包。使用参数包的语法与可变参数函数的语法不同。
我假设你的函数应该 return true
当且仅当所有参数都是非空指针时。实现您的功能的一种方法是:
inline constexpr bool nullPointCheck() { return true; }
template<typename T, typename... Args>
constexpr bool nullPointCheck(T&& first, Args&&... args)
{
return first && nullPointCheck(args...);
}
rontgen的回答也不错
您实际上可以使用此函数来检查任意参数列表是否全部 true
。我使用了通用引用,这样就不会对参数进行复制;这对指针没有影响,但可能对更复杂的类型有影响。
要将函数限制为仅接受指针,请将 T&&
更改为 T *
。 (保持 Args&&
不变)。如果你还想接受文字 nullptr
那么你还需要一个重载:
inline constexpr bool nullPointCheck(std::nullptr_t) { return false; }
因为nullptr
实际上并没有推导出任何T *
。