基礎的だが曖昧なc++文法問題

2121 ワード

1、作業現場コード:
[cpp]
view plain
copy
print
?
typedef MyData 

  •     int data1; 
  •     int data2; 

  • } * LPMYDATA; 
  •  

  • const LPMYDATA pData = getData(); 
  • //do sth else 

  • pData = getNewData();  //compile error 
    typedef MyData
    {
        int data1;
        int data2;
    } * LPMYDATA;
    
    const LPMYDATA pData = getData();
    // do sth else
    pData = getNewData();   // compile error

    2、分析:
     
    a、まずconstの使い方を知っておくべきです.いくつかの面接問題もこの問題を考察するのが好きです.例えば、const char*とchar const*とchar*constの違いなどです.
    最初の2つは等価で、constがポインタの前にあるとポインタが指す実際のメモリ領域は変更できません.constがポインタの後ろにあると、ポインタ自体は変更できません.前後にあれば修正できません.
    b、c++コードでこのtypedefで構造を定義するのは好きではありませんが、上記のtypedefの使い方には問題はありません.しかし、なぜpDataに2回目の付与ができないのですか?pDataはなぜ修正できない定数になったのですか?
     
    3、結論:
        typdef xxx *PXXX;このようなtypedefを経て、PXXXは一般的なdefine形式の文字列置換ではなく、全体的なタイプになった.以上の解析によれば、const char*とchar const*は完全に等価であり、すなわちコンパイラにとってconstはタイプ前後で等価である.そこでconst LPMYDATAはLPMYDATA constに等価である.この時また見て、const LPMYDATA pData;この言葉はコンパイラでは次のように理解されています.
    [cpp]
    view plain
    copy
    print
    ?
    MyData* const pData; 
    MyData* const pData;

    これにより,const修飾は確かにポインタそのものであることがわかる.その上でコンパイルできない文は理解できます.
     
    この問題はあいまいだが、確かに私たちの仕事の中で犯しやすい間違いであり、この間違いを犯しても基本的な仕事がまだしっかりしていないことを反映することができる.