2
gcc/g++ 4.7.2
CXXFLAGS -Wall -Wextra -g -O2

こんにちは、

Cスタイルを使用して記述されたこのヘッダーファイル(mu_test.h)があります。次のマルコスが含まれています

#define GET_ERROR() ((errno == 0) ? "None" : strerror(errno))

#define LOG_ERR(fmt, ...) fprintf(stderr, "[ERROR] %s:%d: errno: %s " fmt "\n", __func__, __LINE__, GET_ERROR(), ##__VA_ARGS__)

#define MU_ASSERT(test, msg) do {               \
        if(!(test)) {                           \
            LOG_ERR(msg);                       \
            return msg;                         \
        }                                       \
    } while(0)

mu_test.hを含むg++を使用してコンパイルされたcppファイル(floor_plan_src.cpp)があります

#include "mu_test.h"
char* test_memory_allocation()
{
    plan = new floor_plan();

    MU_ASSERT(plan != NULL, "Failed to allocate memory for floor_plan");

    return NULL;
}

この警告が表示されます:

deprecated conversion from string constant to ‘char*’

したがって、g ++を使用してソースをコンパイルしたため、その関数に渡す文字列定数-marcoはそれ(C文字列)を好みません。

この問題はc/c++の混合に関係していると思いました。

解決策1:mu_test.h内のすべてのマクロをextern"C"でラップします

#ifdef __cplusplus
extern "C"
{
#endif /* _cplusplus */
#define GET_ERROR() ((errno == 0) ? "None" : strerror(errno))

#define LOG_ERR(fmt, ...) fprintf(stderr, "[ERROR] %s:%d: errno: %s " fmt "\n", __func__, __LINE__, GET_ERROR(), ##__VA_ARGS__)

#define MU_ASSERT(test, msg) do {               \
        if(!(test)) {                           \
            LOG_ERR(msg);                       \
            return msg;                         \
        }                                       \
    } while(0)
#ifdef __cplusplus
}
#endif /* __cplusplus */

解決策1でも同じ警告が表示されました。

解決策2:ヘッダーファイルをfloor_plan_src.cppでラップします

extern "C" {
#include "mu_test.h"
}

解決策2でも同じ警告が表示されました

解決策3:関数をラップする

extern "C" char* test_memory_allocation()
{
    plan = new floor_plan();

    MU_ASSERT(plan != NULL, "Failed to allocate memory for floor_plan");

    return NULL;
}

上記と同じ解決策3

解決策4:定数文字列を非constchar*に変換してみてください

MU_ASSERT(plan != NULL, (char*)"Failed to allocate memory for floor_plan");

次のエラーが発生しました:

 expected primary-expression before char
"[ERROR] %s:%d: errno: %s " cannot be used as a function

提案をありがとう、

4

1 に答える 1

4

問題はtest_memory_allocation、文字列リテラルを返す可能性があり、文字列リテラルを非 const に減衰させてはならないことですchar*。C++ では許可されていますが、まだ非推奨です。

コードは次のように展開されます。

char* test_memory_allocation()
{
    plan = new floor_plan();

    do {
        if(!(plan != NULL)) {
            LOG_ERR("Failed to allocate memory for floor_plan")
            return "Failed to allocate memory for floor_plan";
        }
    } while(0);

    return NULL;
}

それを修正するには、test_memory_allocationreturn aを作成するconst char*か、非 const に減衰する可能性のあるものchar*(たとえば、静的char配列またはヒープ割り当てメモリ領域) へのポインターを返すことができます。

extern "C"C++ の名前マングリングを回避するためにのみ必要であり、マクロではなく関数にのみ影響します。

于 2012-12-14T08:39:01.790 に答える