2017-02-10 13 views
-1

"malloc"関数ポインタを返す関数を記述しようとしています。typedefのない戻り関数ポインタエラー?

#include <cstdlib> 


namespace portable { 

    static void *(*malloc_impl)(size_t) = std::malloc; 
    static void (*free_impl)(void*) = std::free; 
    static void *(*realloc_impl)(void*, size_t) = std::realloc; 
    static void *(*calloc_impl)(size_t, size_t) = std::calloc; 

#if defined(_WIN32) && defined(__MINGW32__) 
# error("sorry, we don't support MinGW32 compiler with Windows") 
#endif 

#if defined(_WIN32) && defined(_MSC_VER) 
# include <WinSock2.h> 
# include <Windows.h> 
    static size_t (*malloc_usable_size_impl)(void*) = _msize; 
#elif defined(__APPLE__) 
# include <malloc.h> 
    static size_t (*malloc_usable_size_impl)(void*) = malloc_size; 
#else 
# include <malloc.h> 
    static size_t (*malloc_usable_size_impl)(void*) = malloc_usable_size; 
#endif 

    void *(*o_set_malloc(void *(*func)(size_t))) (size_t) throw() 
    { 
     void *(*old)(size_t) = malloc_impl; 
     if (func) { 
      malloc_impl = func; 
     } 
     return old; 
    } 
    size_t (*o_set_malloc_usable_size(size_t (*func)(void*))) (void*) throw() 
    { 
     size_t (*old)(void*) = malloc_usable_size_impl; 
     if (func) { 
      malloc_usable_size_impl = func; 
     } 
     return old; 
    } 
    void (*o_set_free(void (*func)(void*))) (void*) throw() 
    { 
     void (*old)(void*) = free_impl; 
     if (func) { 
      free_impl = func; 
     } 
     return old; 
    } 
    void *(*o_set_realloc(void *(*func)(void*, size_t))) (void*, size_t) throw() 
    { 
     void *(*old)(void*, size_t) = realloc_impl; 
     if (func) { 
      realloc_impl = func; 
     } 
     return old; 
    } 
    void *(*o_set_calloc(void *(*func)(size_t, size_t))) (size_t, size_t) throw() 
    { 
     void *(*old)(size_t, size_t) = calloc_impl; 
     if (func) { 
      calloc_impl = func; 
     } 
     return old; 
    } 
} 

コンパイラのエラー報告:

重大度コード説明

しかし、エラーがあります、プラットフォームはWindows 7の+のVisual Studio 2015

ソースコード "malloc.cpp" でありますプロジェクトファイル行抑制状態 エラー(アクティブ)

互換性のない例外仕様

d:\ work \ project \ orange \ src \ portable \ malloc.cpp 56

「古い」は返品の種類と互換性がないようです。私を助けてください。

+0

質問にお答えください。 – linrongbin

+1

[mcve]は役に立ちます。 http://webcompiler.cloudapp.net/でコンパイラエラーを再現することはできません。 – chris

答えて

-1

コメントありがとう、私は問題を見つける。

#define NOEXCEPT throw() 

互換性がないが、 "void *(*)(size_t)" と "void *(*)(size_t) throw()" の間にある:+ VS2015のWindows 7上で

は、私は次のように定義されました。