簡體   English   中英

C中的雙指針const正確性警告

[英]Double pointer const-correctness warnings in C

指向非常量數據的指針可以隱式轉換為指向相同類型的常量數據的指針:

int       *x = NULL;
int const *y = x;

從邏輯上講,添加其他const限定符以匹配其他間接尋址應以相同的方式進行:

int       *      *x = NULL;
int       *const *y = x; /* okay */
int const *const *z = y; /* warning */

但是,使用帶有-Wall標志的GCC或Clang進行編譯會導致以下警告:

test.c:4:23: warning: initializing 'int const *const *' with an expression of type
      'int *const *' discards qualifiers in nested pointer types
    int const *const *z = y; /* warning */
                      ^   ~

為什么要添加額外的const限定詞“在嵌套指針類型中丟棄限定詞”?

const只能被const添加的原因是微妙的,由comp.lang.c FAQ中的問題11.10進行了解釋。

簡要地,請考慮與您的示例緊密相關的示例:

const int i;
int *p;
int const **z = &p;
*z = &i;
/* Now p points to i */

C通過僅允許分配在第一個指向級別上丟棄限定符來避免此問題(因此,此處不允許分配給z )。

您的確切示例不會遇到此問題,因為const第二級意味着無論如何都不允許分配給*z C ++ 允許它在這個確切情況,但是C的簡單規則,不會將您的情況和上面的例子加以區分。

由其他答案鏈接的FAQ條目解釋了為什么不允許以下代碼:

int **x = whatever;
const int **z = x;

但是,您的代碼const int *const *z = x; 完全不同,並且不會遇到FAQ提出的相同缺陷。

實際上,后一種代碼在概念上沒有錯。 不允許這樣做只是C規范中的一個缺陷,它迫使C程序員在其代碼中包含丑陋的強制類型轉換。

C可能會使用與C ++相同的規則。 但是C標准委員會沒有決定這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM