2012-07-30 61 views
4

我試圖在我的項目中使用va_start和va_end函數,但eclipse不想將它解析爲函數。 GCC編譯沒有錯誤,整個項目...Android NDK:函數va_start/va_end無法解析

[MYFILE.CPP]

#include <stdio.h> 
#include <stdarg.h> 
[...] 
inline void ShowDbgMsg(const char* str, ...) 
{ 
    va_list argptr; 
    va_start(argptr, str); 
    vprintf(str, argptr); 
    va_end(argptr); 
} 
[...] 

[Android.mk]

[...] 
LOCAL_C_INCLUDES := jni/pvrTools/ jni/igel/ $(STLPORT_BASE)/stlport 
[...] 

Eclipse中說:

[...] 
Description Resource Path Location Type 
Function 'va_start' could not be resolved igel.comdef.h /NativeProject/jni/igel line 195 Semantic Error 
Function 'va_end' could not be resolved igel.comdef.h /NativeProject/jni/igel line 203 Semantic Error 
Function 'va_start' could not be resolved igel.string.h /NativeProject/jni/igel line 341 Semantic Error 
Function 'va_end' could not be resolved igel.string.h /NativeProject/jni/igel line 351 Semantic Error 
[...] 

所以,看起來像Eclipse無法找到一些東西......如何解決這個問題? 在此先感謝!

附表>項目 - >索引 - >重建沒有幫助。 :(

回答

0

我用嵌入式編譯器功能代替我va_ *代碼解決這個問題:

#ifdef IGEL_PLATFORM_ANDROID 
# define ShowDbgMsg(...) ((void)__android_log_print(ANDROID_LOG_INFO, "igel-debug", __VA_ARGS__)) 
#else 
inline void ShowDbgMsg(const char* str, ...) 
{ 
    va_list argptr; 
    va_start(argptr, str); 
    vprintf(str, argptr); 
    va_end(argptr); 
} 
#endif // IGEL_PLATFORM_ANDROID 

我知道這不是一個很好的解決方案,但它工作

7

我的解決方法也是不漂亮。但在刪除錯誤標記100次之後,請嘗試將此代碼放在某處,然後再包含stdlib.h,然後在Project :: Properties :: C++ General :: Paths and Symbols中定義ECLIPSEBUILD = 1。



    #if ECLIPSEBUILD // this part is just to fix spurious Eclipse errors 
    typedef __builtin_va_list va_list; 
    #define va_start(v,l) __builtin_va_start(v,l) 
    #define va_end(v) __builtin_va_end(v) 
    #define va_arg(v,l) __builtin_va_arg(v,l) 
    #if !defined(__STRICT_ANSI__) || __STDC_VERSION__ + 0 >= 199900L || defined(__GXX_EXPERIMENTAL_CXX0X__) 
    #define va_copy(d,s) __builtin_va_copy(d,s) 
    #endif 
    #define __va_copy(d,s) __builtin_va_copy(d,s) 
    typedef __builtin_va_list __gnuc_va_list; 
    typedef __gnuc_va_list va_list; 
    typedef va_list __va_list; 
    #endif 

0
#include <stdarg.h> // includes va_list 

inline void ShowDbgMsg(char* format, ...) 
{ 
    va_list ap;  
    va_start(ap, format); 

//替換vfprintf(stderr中,格式,AP):

__android_log_vprint(0, __FILE__, format, ap); 
    va_end(ap); 
}