簡體   English   中英

C 標准:結構和聯合說明符:“適當轉換”的確切定義是什么?

[英]C standard: structure and union specifiers: what is the exact definition of 'suitably converted'?

N2479 C17..C2x 工作草案 — 2020 年 2 月 5 日 ISO/IEC 9899:202x (E)(已添加重點):

6.7.2.1 結構和聯合說明符

17 在結構 object 中,非位域成員和位域所在的單元的地址按聲明順序遞增。 指向結構 object 的指針,經過適當轉換,指向其初始成員(或者如果該成員是位字段,則指向它所在的單元),反之亦然。 結構 object 中可能有未命名的填充,但不是在其開頭。

18 工會的規模足以容納其最大的成員。 任何時候最多可以將其中一個成員的值存儲在聯合 object 中。 一個指向聯合 object 的指針,經過適當轉換,指向它的每個成員(或者如果成員是位字段,則指向它所在的單元),反之亦然。

問題: suitably converted的確切定義是什么?

額外:如果沒有suitably converted的確切定義,那么 C 實現文件是否應記錄其理解? 例如(C/C++ 預處理器域),Microsoft 將術語single item (C++,N4713)理解為single, permanently indivisible preprocessor token (這會導致從 gcc/clang/other 移植代碼時出現問題,這有不同的理解),但是,似乎他們沒有記錄他們對single item的理解。

在這種情況下,“適當的轉換”意味着轉換為適當的兼容類型。 例如:

#include <stdio.h>

struct mystruct {
    double a;
    int b;
};

int main()
{
    struct mystruct s = { 2.5, 4 };
    double *d = (double *)&s;
    printf("%f\n", *d);   // prints 2.500000
    return 0;
}

這里struct mystruct的第一個成員的類型double 因此,在這種情況下,“適當的轉換”意味着struct mystruct *可以通過顯式強制轉換轉換為double *並且它將指向a成員。

這不是一個具有特殊含義的術語。

您正在處理從類型 A 到類型 B 的轉換。類型 A 是指向結構的類型。 除了必須適合用作指向初始成員的指針外,未指定類型 B。 因此,它必須是一個指針(所以我們只處理兩種指針類型之間的轉換)並且它必須遵循嚴格的別名規則(目標類型可以是指向窄字符類型std::byte的指針,它的實際類型第一個成員,或表示兼容的類型,例如僅在符號上不同)。

導致合適指針的任何指針轉換都滿足“適當轉換”。

問題:適當轉換的確切定義是什么?

C 標准沒有給出“適當轉換”的任何“確切定義”。

我將其解釋為對“指向初始成員類型的指針”或“指向結構類型的指針”類型的任何轉換序列,以便轉換規范確保最終指針指向適當的地址。 例如,沒有通過可能不正確的 alignment 的轉換。)

補充:如果沒有適當轉換的確切定義,那么C實現文件是否應該對其理解?

C 標准對 C 實施沒有任何要求,以記錄其對“適當轉換”的理解或解釋。

這不是一個正式的術語,但在字里行間我們可以看出它用於表示有效的指針轉換。 它需要由程序員通過強制轉換顯式執行。

在 C 中,幾乎任何 object 指針都可以轉換為另一個 object 指針轉換。 但是,如果您通過錯誤的類型取消引用這樣的指針,會發生什么情況卻完全不同。 大多數情況下,這是定義不明確的行為。

在這種情況下有效的指針轉換:

  • 指向與第一個成員的類型兼容的類型的指針。 1) 2) 3)
  • 一個空指針。 1) 2)
  • 指向字符類型的指針。 2)
  • 指向另一種結構類型的指針,其中兩個結構都是union的一部分並共享兼容類型的公共初始成員。 4)

可選地,上述任何一種情況下的指針都可以是類型限定的。 除非第一個成員是限定類型,在這種情況下,指針需要共享該類型的所有限定符。 1) 3)

1)簡單賦值規則 6.5.16.1。
2)關於指針轉換的規則(6.3.2.3)。
3)兼容類型限定符的規則(6.7.3)。
4)共同初始序列規則(6.5.2.3)。

常見的初始序列一是一個奇怪的規則,它顯然得到了較差的編譯器支持,但它符合“嚴格別名”。

暫無
暫無

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

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