2013-12-11 5 views
0

Я переношу заголовки tcl/tk C в D, и я столкнулся с типом, который нигде не определен. Внутри файла tclPlatDecls.h есть следующее определение:В заголовке C tclPlatDecls.h, где определено значение TclPlatStubHooks?

typedef struct TclPlatStubs { 
    int magic; 
    struct TclPlatStubHooks *hooks; 

#ifdef __WIN32__ /* WIN */ 
    TCHAR * (*tcl_WinUtfToTChar) (CONST char *str, int len, Tcl_DString *dsPtr); /* 0 */ 
    char * (*tcl_WinTCharToUtf) (CONST TCHAR *str, int len, Tcl_DString *dsPtr); /* 1 */ 
#endif /* WIN */ 
#ifdef MAC_OSX_TCL /* MACOSX */ 
    int (*tcl_MacOSXOpenBundleResources) (Tcl_Interp *interp, CONST char *bundleName, int hasResourceFile, int maxPathLen, char *libraryPath); /* 0 */ 
    int (*tcl_MacOSXOpenVersionedBundleResources) (Tcl_Interp *interp, CONST char *bundleName, CONST char *bundleVersion, int hasResourceFile, int maxPathLen, char *libraryPath); /* 1 */ 
#endif /* MACOSX */ 
} TclPlatStubs; 

Я не могу найти определение TclPlatStubHooks. Любая идея, где это? Я grep'ed всей базы кода и нет определения нигде. Даже поиск в сети не дает никаких результатов.

ответ

2

Для чего это стоит, я подтвержу, что ваш grep работает, я нашел только одну ссылку на него, в версиях 8.5.15 и 8.4.20.

Что может представлять интерес в том, что в 8.6.1 определение изменяется на void *, как показано ниже.

typedef struct TclPlatStubs { 
    int magic; 
    void *hooks; 

#if defined(__WIN32__) || defined(__CYGWIN__) /* WIN */ 
    TCHAR * (*tcl_WinUtfToTChar) (const char *str, int len, Tcl_DString *dsPtr); /* 0 */ 
    char * (*tcl_WinTCharToUtf) (const TCHAR *str, int len, Tcl_DString *dsPtr); /* 1 */ 
#endif /* WIN */ 
#ifdef MAC_OSX_TCL /* MACOSX */ 
    int (*tcl_MacOSXOpenBundleResources) (Tcl_Interp *interp, const char *bundleName, int hasResourceFile, int maxPathLen, char *libraryPath); /* 0 */ 
    int (*tcl_MacOSXOpenVersionedBundleResources) (Tcl_Interp *interp, const char *bundleName, const char *bundleVersion, int hasResourceFile, int maxPathLen, char *libraryPath); /* 1 */ 
#endif /* MACOSX */ 
} TclPlatStubs; 

Может быть, вы могли бы уйти с лечением его как void *?

+0

Вполне возможно, что это то, что * используется *, чтобы указать на нечто реальное, но которое больше не нужно. Если это так, оно сохраняется, так как эта структура не может быть сокращена вообще из-за Tcl 8. * с очень строгим требованием совместимости ABI. (Он инициализирован 'NULL' ...) –

Смежные вопросы