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
提案をありがとう、