我正在尝试开发一个Android键盘,使用Android AOSP键盘来源作为模型。有相当多的JNI代码,我的C++是有点生疏,和我有以下定义麻烦宏NELEMS
:此代码发生了什么?
// Disclaimer: You will see a compile error if you use this macro against a variable-length array.
// Sorry for the inconvenience. It isn't supported.
template <typename T, int N>
char (&ArraySizeHelper(T (&array)[N]))[N];
#define NELEMS(x) (sizeof(ArraySizeHelper(x)))
当我尝试编译,该代码的第二行(只是#define
以上)有错误亮起:
Declaration of reference variable requires an initializer
错误消息有一定的道理给我; AOSP代码没有。符号ArraySizeHelper
在AOSP代码中没有其他地方出现或者生成文件(也就是说,就我可以告诉它它不是某个宏的宏而言)。
从宏的名称,我猜测它应该计算为数组中的元素数量。据我所知,通常的做法是:
#define NELEMS(x) (sizeof(x)/sizeof((x)[0]))
所以我想知道是否有其他事情发生在这里。
我很感激这个代码应该做什么的解释,以及关于如何处理编译错误的指导。
编辑:我正在通过Android Studio 1.3 RC 3,Android NDK r10e和Gradle 2.5进行编译。编译使用各种工具链(如this Android documentation中所述)。奇怪的是,上面的代码现在编译并正确执行(可能总是这样做)。但是,Android studio仍然在该行上显示错误。它还显示每次使用的NELEMS
的错误:
Error after macro substitution: Too many arguments, expected 0
我现在在想,这是一个IDE代码分析错误,而不是一个编译器或编码问题。我原来的问题是关于代码本身,所以我将此线程标记为已回答。我会打开关于什么似乎是IDE问题的另一个问题。感谢大家的解释!
如果您为参数提供*指针*以及如何发出首个地址,请采取第二种方式尝试并考虑其*如何工作*(但不是您想如何)。就第一个而言,您可能希望提供您正在使用的C++编译器工具链信息,因为它可以与我过去十年来使用的几乎所有C++编译器一起工作([见它实时](http:// ideone.com/l3OWYN))。通常会引发第一个人的事情是,实际的模板功能不需要*实现*,但它仍然有效。 – WhozCraig
你到底是如何编译它的? (较老的编译器可能在语法上有问题。) –
@AlanStokes - 我正在使用Android NDK提供的标准工具链。 –