簡體   English   中英

為什么轉換 Foo** → const Foo** 在 C++ 中是一個錯誤,而在 C 中只是一個警告?

[英]Why converting Foo** → const Foo** is an error in C++, but only a warning in C?

char const c = 'x';       /* 1 */
char *p1;                 /* 2 */
char const **p2 = &p1;    /* 3 */
*p2 = &c;                 /* 4 */
*p1 = 'X';                /* 5 */

第 3行在C 中是不允許的,在 C++ 中無效 然而,一個人在 C++ 中得到一個錯誤,但在 C 中只有一個警告。問題是 - 為什么只有一個警告?

C 和 C++ 都將語句 3 處理為“使用char**分配const char** char**會丟棄const限定符”,區別在於; C++ 比 C 更嚴格,並且不允許丟棄const限定符。 這在 C++ 中非常方便,並且不會導致與 C 相反的問題。

想象一下以下代碼:

    char const c = 'x';
    char *p1 = &c;
    *p1 = 'A';

    printf("c address: 0x%X, p1 is pointing to: 0x%X\n", &c, p1);
    printf("%c\n", c);
    printf("%c\n", *p1);

這是一個可編譯的 C 代碼。 有人會認為為*p1分配一個新值應該是不可能的,因為它指向一個const變量。 還有人會認為,如果它確實發生了,我們可以改變 p 指向的值,這也會改變c的值,但事實並非如此!!

上面的代碼出人意料地生成:

c address: 0xEF3E146B, p1 is pointing to: 0xEF3E146B
x
A

因此,允許丟棄這個 const 限定符確實會導致未定義的行為(這意味着由編譯器決定要做什么)。 這在 C++ 中是固定的,以避免這種歧義。

C 的指針規則比 C++ 寬松得多。 C++ 比 C 強制執行更多的類型安全。其中一些取決於編譯器決定只在 C 中發出警告。

要查看的一個示例是 malloc,其中char* str = malloc(50); 非常好 C 但必須是char* str = (char*) malloc(50); 在 C++ 中。

簡短的回答是:因為它們是不同的語言並且有不同的規則。 沒有 C/C++ 語言。

暫無
暫無

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

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