当gcc
作为参数分配或传递给更具体指针类型的类型时,如何void*
发出警告,如my_struct*
没有强制转换?我想确保所有演员都是明确的。
更新:此问题的范围也扩展到非gcc
短信。
Update2 :到处都有错误?我被一个简单的,纯粹技术问题所产生的争议所困扰,我感到很沮丧。
答案 0 :(得分:0)
如果
gcc
被指定或传递为void*
,我该怎样警告void *
参数类型是一种更具体的指针
能够在没有强制转换的情况下将void
分配给更具体的类型是C编程语言的必需部分。根据{{3}}的 6.3.2.3指针的第1段:
指向
void
的指针可以转换为指向任何指针的指针 对象类型。指向任何对象类型的指针可以转换为 指向5
然后再返回的指针;结果应该相等 到原始指针。
您要求收到有关C部分必需部分的警告。当int
被分配到-Wc++-compat
时,它与要求警告的距离不远。
正如@MarcGlisse所指出的那样,the C Standard:
void *
(仅限C和Objective-C)警告ISO C和ISO C ++的公共子集之外的ISO C结构,例如:请求从
void
隐式转换为指向非with CTE as ( select t1.*, row_number() over(order by customer_id) as r_ord from Mytable t1 ) select CTE.* from CTE where (mod(datediff(day, '2016-01-01', getdate()),3) = 0 and r_ord <= 5000) or (mod(datediff(day, '2016-01-01', getdate()),3) = 1 and r_ord between 5001 and 10000) or (mod(datediff(day, '2016-01-01', getdate()),3) = 2 and r_ord > 10000)
类型的指针。
答案 1 :(得分:-1)
正如@MarcGlisse所述,gcc
提供了-Wc++-compat
警告选项。在其他非C++
兼容的构造中,它警告void*
的静默转换。
@AndrewHenle链接到另一个问题的答案,该问题表明要求显式强制转换具有增加不兼容转换可能性的可能性的缺点,例如,如果程序员意外地转换了数值。
我认为这不是一个问题,因为通过明确的演员,程序员证明他们知道他们在做什么。毫无疑问,即使是这个小缺点也可以通过将以下宏与-Wc++-compat
结合使用来解决:
#define VOID_CAST(T, x) ({ __typeof__(x) void_cast_x __attribute__((__unused__)) = ((__typeof__(x))((void*)(x))); ((T*)(x)); })
幸运的是,“无用”分配将被优化,使用VOID_CAST
的好处是,如果x
不是void*
,它将生成错误或警告用。