代码:
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);
它不会抱怨两者,但正确的方法是什么?
答案 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了解有关禁用代码特定部分警告的详细信息。