-Wcast-qual:从指针目标类型

时间:2017-05-31 08:47:45

标签: c gcc casting type-conversion

代码:

static const char *a = NULL;
abc((char **)&a);

abc方法定义为:

abc(char** a)

我收到错误(警告被视为错误):

  error: cast discards '__attribute__((const))' qualifier from pointer target type [-Werror=cast-qual]

为了解决这个问题,我补充说:

#ifdef _PTR_CAST_
#define SIZE_T_CAST uintptr_t 
#else
#define SIZE_T_CAST size_t
#endif

我的问题是,如果api调用是

abc( (char **)(SIZE_T_CAST)&a); or
abc( (char **)(SIZE_T_CAST *)&a);

它不会抱怨两者,但正确的方法是什么?

1 个答案:

答案 0 :(得分:1)

首先,宏SIZE_T_CAST是一个糟糕的主意。只需使用正确的类型。

代码(char **)(uintptr_t)&a(char **)(void *)&a可能有效,但C标准并未保证。

然而,不使用演员表会更好的编码风格。而是创建一个包装函数,例如在头文件中你可以:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wcast-qual"
inline void const_abc(const char ** p)
{
    abc( (char **)p );
}
#pragma GCC diagnostic pop

然后在其余代码中,当您有const_abc参数时调用const char **

See here了解有关禁用代码特定部分警告的详细信息。