gcc/g++ 4.7.2
CXXFLAGS -Wall -Wextra -g -O2
您好,
我有这个使用C风格编写的头文件(mu_test.h)。它包含以下marcos
#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)
我有一个使用g ++编译的cpp文件(floor_plan_src.cpp),其中包含mu_test.h
#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*’
所以我传递给函数的字符串常量就像marco一样不喜欢它(C字符串),因为我使用g ++编译了我的源代码。
我认为这个问题与混合c / c ++有关。
解决方案1:使用extern“C”
包装mu_test.h中的所有宏#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: 尝试将常量字符串转换为非const char *
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
非常感谢任何建议,
答案 0 :(得分: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_allocation
返回const char*
,否则您可以返回指向可能衰减为非常量char*
的指针(例如静态) char
数组或堆分配的内存区域。)
extern "C"
只需要避免C ++名称修改,它只影响函数,而不影响宏。