我正在嘗試開發一個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提供的標準工具鏈。 –