z0l*_*pka 3 c linux gcc casting const
假设我有一些这样的代码:
void foo (void *ptr) {
    const struct some *azaza = (const struct some *)ptr;
    azaza->some_field = 123; // inadvertently assignment => error
    // ...
Run Code Online (Sandbox Code Playgroud)
在const符真正需要的投?
编辑:foo是的回调具有功能特定的原型,我不能改变(这不是在我的代码)。
在您的特定情况下,您甚至不需要强制转换。在void * 强制转换的情况下,仅在取消引用时才需要。这样就足够了:
const struct some *azaza = ptr;
Run Code Online (Sandbox Code Playgroud)
但是为了利益,
#gcc test.c:
// 1)
const struct some *azaza = ptr;
azaza->some_field = 123; // error: assignment in read-only object
// 2)
struct some *azaza = (const struct some *)ptr; // (!)warning: initialization discards ‘const’ qualifier
azaza->some_field = 123;
Run Code Online (Sandbox Code Playgroud)
#gcc test.c -pedantic-errors:
// 1)
const struct some *azaza = ptr;
azaza->some_field = 123; // error: assignment in read-only object
// 2)
struct some *azaza = (const struct some *)ptr; // error: initialization
                                               // discards ‘const’ qualifier
azaza->some_field = 123;
Run Code Online (Sandbox Code Playgroud)
总结一下:
const演员表。const仅使用强制转换(出于某种奇怪的原因._。)而没有使用-pedantic-errors-意外分配不会导致错误,这将带来很多后果。|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           76 次  |  
        
|   最近记录:  |