簡體   English   中英

標准布局類的offsetof嗎?

[英]offsetof on standard-layout class?

#include <iostream>
#include <cstddef>
class Foo
{
    int a;
    int b;
    float c;
};
int main()
{
    Foo foo;
    std::cout << offsetof(Foo, b) << std::endl;
    return 0;
}

上面的代碼無法使用gcc-4.8.2或vc ++ 11進行編譯。 錯誤消息是無法訪問類Foo中的私有成員b。

但是根據標准,offsetof應該支持標准布局類,而Foo是標准布局類。

這是gcc-4.8.2或vc ++ 11的缺陷,還是我對c ++標准的理解是錯誤的?

默認情況下,類中的數據成員是私有的 只有在public聲明了它們,才可以從main訪問它們。或者,您可以通過在public下的類中聲明一個函數並從main調用它,來從main訪問它們。 由於類中的函數可以訪問類中的數據成員,因此您可以訪問私有數據成員。

offsetof被定義為一個 ,因此它不能繞過訪問控制並獲得對私有成員的訪問權,我們可以通過起草C ++標准第17.6.1.2標題5段來說明這種情況( 強調我的意思 ):

即使C授予了實現功能的許可,在C中定義為宏的名稱也應在C ++標准庫中定義為宏 [注意:在C中定義為宏的名稱包括:assert, offsetof ,setjmp,va_arg,va_end和va_start。 —尾注]

更新

因此,有一些駭客可以允許您以標准方式訪問類的私有成員,但是如果我們回到C99草案標准(C ++標准草案依賴於offsetof),那么我們將在7.17節“ 通用定義”3段中看到說( 強調我的 ):

   offsetof(type, member-designator)

它從其結構的開頭(按類型指定)擴展為​​一個具有size_t類型的整數常量表達式,該值的大小為以字節為單位的結構成員(由mem​​ber-designator指定)的偏移量。 類型和成員代號應使

   static type t;

然后表達式&(t.member-designator)的結果為地址常量

如果您嘗試從班級外部訪問私人成員 ,情況就不會如此。

類成員默認為私有。 將它們列出為公共,或將Foo用作結構(因為結構成員默認為public),然后進行上述工作,否則main不允許訪問b,而offsetof被視為訪問。

暫無
暫無

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

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