4

プロジェクトで va_start および va_end 関数を使用しようとしていますが、Eclipse はそれを関数として解決したくありません。gcc はプロジェクト全体をエラーなしでコンパイルします...

[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
[...]

エクリプス 言います:

[...]
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 が何かを見つけられないようです... この問題を解決するにはどうすればよいですか? 前もって感謝します!

PS> Project->Index->​​Rebuild は役に立ちませんでした。:(

4

3 に答える 3

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

 
于 2012-10-15T21:45:41.223 に答える
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

私はそれが良い解決策ではないことを知っていますが、うまくいきます。

于 2012-07-31T02:13:17.737 に答える
0
#include <stdarg.h> // includes va_list

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

// vfprintf( stderr, format, ap ) を次のように置き換えます。

   __android_log_vprint(0, __FILE__, format, ap);
  va_end( ap );
}
于 2015-07-19T20:19:55.450 に答える