C代码和C++翻译初始化不同

Moo*_*ght 2 c initialization c++11

我有一个旧的C代码,我在C++ 11中重写.在较旧的C代码(它是一个控制台应用程序)中struct,它是TC.C文件中的全局变量; 有问题的结构是

typedef struct 
{
   char* m_szTabName;         
   char* m_szCWName;          
   FILE* m_fpCWFile;          
   double* m_dNatCost;        
   double* m_dStateCost;      
   double* m_dLocalCost;      
   short m_nDateRanges;       
   short m_sNumCodes;         
   GTIME* m_gStart;           
   GTIME* m_gEnd;             
   short* m_sIcdVsn;          
   short* m_sIcdEdn;          
   MapRecord** m_tIcdMap;     
   FileHeader m_tHdr;         
   CodeHeader m_tDxTab;       
   CodeHeader m_tPrTab;       
   CCMatrixHeader m_tCCMatTab;
   NeoHeader m_tNeoTab;       
   DRGHeader m_tDRGTab;       
   CCHeader m_tCCTab;         
   CCExclHeader m_tCCExclTab; 
   LogicHeader m_tLogic;        
   CodeRecord* m_tCodeRec;    
   char* m_szLabStore;        
} Grouper;
Run Code Online (Sandbox Code Playgroud)

在C代码这struct初始化并用于如下

#include "tabcomp.h"
#include "OtherHeaderFiles"
...
Grouper tgLoc;
...
void main(int argc, char *argv[])
{
    FILE *fpOut, *fpIn;
    ...
    CreateCodeTable(fpIn, &tgLoc.m_tDxTab, (int)DX_LAB);   
    ...
}
Run Code Online (Sandbox Code Playgroud)

所以Grouper tgLoc没有得到初始化,在调用CreateCodeTable中的值tgLoc

tgLoc  Grouper:
+       m_szTabName     0x00000000 <NULL> char *
+       m_szCWName      0x00000000 <NULL> char *
+       m_fpCWFile      0x00000000 <NULL> _iobuf *
+       m_dNatCost      0x00000000 {???} double *
+       m_dStateCost    0x00000000 {???} double *
+       m_dLocalCost    0x00000000 {???} double *
+       m_nDateRanges   0 short
+       m_sNumCodes     0 short
+       m_gStart        0x00000000 {???} long *
+       m_gEnd          0x00000000 {???} long *
+       m_sIcdVsn       0x00000000 {???} short *
+       m_sIcdEdn       0x00000000 {???} short *
+       m_tIcdMap       0x00000000 {???} TMapRec * *
+       m_tHdr          {m_sCreateDate=0x00e80150 "" m_usRefID=0 m_cHiByte=0 '\0' ...} FileHeader
+       m_tDxTab        {m_ucCodeLen=0 '\0' m_usNumHdr=0 m_usNumCodes=0 ...} CodeHeader
+       m_tPrTab        {m_ucCodeLen=0 '\0' m_usNumHdr=0 m_usNumCodes=0 ...} CodeHeader
+       m_tCCMatTab     {m_ucNRow=0 '\0' m_ucNCol=0 '\0' m_cpCCMatrix=0x00000000 <NULL> } CCMatrixHeader
+       m_tNeoTab       {m_usNumCodes=0 m_ucNeoVal=0x00000000 <NULL> } TNeoHdr
+       m_tDRGTab       {m_usNumDRG=0 m_usNumBits=0 m_bBitVals=0x00000000 {???} ...} DRGHeader
+       m_tCCTab        {m_usNumCodes=0 m_ucSep=0x00000000 <NULL> m_useCCRow=0x00000000 {???} } CCHeader
+       m_tCCExclTab    {m_usNumCCHdr=0 m_usNumCCTail=0 m_usLowPDX=0x00000000 {???} ...} CCExclHeader
+       m_tLogic        {wFldErr=0 wDefLen=0 wFldLen=0 ...} LogicHeader
+       m_tCodeRec      0x00000000 <NULL> CodeRecord *
+       m_szLabStore    0x00000000 <NULL> char *
Run Code Online (Sandbox Code Playgroud)

现在,我已将代码从C应用程序移动到C++ 11应用程序.代码运行正常,但现在tgLoc调用的值CreateCodeTable

tgLoc Grouper:
+       m_szTabName     0xcdcdcdcd <Error reading characters of string.> char *
+       m_szCWName      0xcdcdcdcd <Error reading characters of string.> char *
+       m_fpCWFile      0xcdcdcdcd {_ptr=??? _cnt=??? _base=??? ...} _iobuf *
+       m_dNatCost      0xcdcdcdcd {???} double *
+       m_dStateCost    0xcdcdcdcd {???} double *
+       m_dLocalCost    0xcdcdcdcd {???} double *
        m_nDateRanges   -12851 short
        m_sNumCodes     -12851 short
+       m_gStart        0xcdcdcdcd {???} long *
+       m_gEnd          0xcdcdcdcd {???} long *
+       m_sIcdVsn       0xcdcdcdcd {???} short *
+       m_sIcdEdn       0xcdcdcdcd {???} short *
+       m_tIcdMap       0xcdcdcdcd {???} MapRecord * *
+       m_tHdr          {m_sCreateDate=0x27570cc0 "ÍÍÍÍÍÍ... m_usRefID=52685 m_cHiByte=-51 'Í' ...} FileHeader
+       m_tDxTab        {m_ucCodeLen=205 'Í' m_usNumHdr=52685 m_usNumCodes=52685 ...} CodeHeader
+       m_tPrTab        {m_ucCodeLen=205 'Í' m_usNumHdr=52685 m_usNumCodes=52685 ...} CodeHeader
+       m_tCCMatTab     {m_ucNRow=205 'Í' m_ucNCol=205 'Í' m_cpCCMatrix=0xcdcdcdcd <Error reading characters of string.> } CCMatrixHeader
+       m_tNeoTab       {m_usNumCodes=52685 m_ucNeoVal=0xcdcdcdcd <Error reading characters of string.> } NeoHeader
+       m_tDRGTab       {m_usNumDRG=52685 m_usNumBits=52685 m_bBitVals=0xcdcdcdcd {???} ...} DRGHeader
+       m_tCCTab        {m_usNumCodes=52685 m_ucSep=0xcdcdcdcd <Error reading characters of string.> m_useCCRow=0xcdcdcdcd {...} } CCHeader
+       m_tCCExclTab    {m_usNumCCHdr=52685 m_usNumCCTail=52685 m_usLowPDX=0xcdcdcdcd {???} ...} CCExclHeader
+       m_tLogic        {wFldErr=52685 wDefLen=52685 wFldLen=52685 ...} LogicHeader
+       m_tCodeRec      0xcdcdcdcd {szCode=0xcdcdcdcd <Error reading characters of string.> ucFldNum=??? ucFldType=??? ...} CodeRecord *
+       m_szLabStore    0xcdcdcdcd <Error reading characters of string.> char *
Run Code Online (Sandbox Code Playgroud)

在调用之前只有一小段代码CreateCodeTable而且没有初始化tgLoc,所以我的问题是,为什么在C++ 11下编译的新代码初始化与旧的C代码不同,以及如何初始化新代码所以它tgLoc包含与首次使用的旧代码相同的值?

我知道这0xCDCDCDCD是一个调试值,来自C运行时库的内容.当你在调试版本中分配一块内存时,它会被初始化为这个虚假值,希望能够捕获bug.0xCDCDCDCD是非NULL并且永远不是有效的内存指针.但这似乎影响了该CreateCodeTable方法的输出.我也不明白为什么这个值在被编译为C++ 11时被初始化为C? 参考

谢谢你的时间.

del*_*ver 5

所以Grouper tgLoc没有初始化

是的. 它是一个全局的,因此初始化为0,这是你可以看到的.从C 99标准草案的6.7.8开始:

10)如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的.如果未显式初始化具有静态存储持续时间的对象,则:

  • 如果它有指针类型,则将其初始化为空指针;
  • 如果它有算术类型,则初始化为(正或无符号)零;
  • 如果是聚合,则根据这些规则初始化(递归)每个成员;
  • 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员.

确定"静态存储持续时间"是什么的规则在第6.2节中详细说明,在本例中为6.2.4.3,"其标识符用外部或内部链接声明或与存储类说明符静态的对象具有静态存储持续时间 ".

没有关键字static(也称为全局)的文件范围标识符具有外部链接.

我已将代码从C应用程序移动到C++ 11应用程序.代码运行正常,但现在调用CreateCodeTable时tgLoc的值

很可能是因为现在它真的没有初始化,所以包含操作系统提供的伪垃圾(或真正的垃圾,从RAM提供,或你引用的调试值).这意味着它不再是全局变量(局部变量没有链接,因此没有"自动存储持续时间",因此不会隐式初始化 - 这适用于C和C++).无论如何,您可以使用以下命令初始化为0:

Grouper tgLoc = { 0 };
Run Code Online (Sandbox Code Playgroud)

这适用于所有成员,而不仅仅是第一个成员.在C++中,= { }就好了.

如果不清楚:如果你想要一个充满零的结构,它必须以这种方式初始化,无论是显式还是隐式,如第一种情况.