2012-03-08 291 views
2

在这个头文件中,我收到错误:unknown type name uint32,unit16。我是Objective-C的新手,我正尝试在Xcode中导入项目。由于上述问题,构建失败。谷歌没有帮助。试着在标题搜索路径中添加/stdint/stdint.hxcode unknown type name,unknown type name 'uint8_t', MinGW,Xcode - how to include c library and header file to cocoa project?)。建设仍然失败。未知类型名称uint32/unit16

/*------------------------------------------------------------------------- 
    * 
    * block.h 
    * POSTGRES disk block definitions. 
    * 
    * 
    * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group 
    * Portions Copyright (c) 1994, Regents of the University of California 
    * 
    * $PostgreSQL: pgsql/src/include/storage/block.h,v 1.26 2010/01/02 16:58:08 momjian Exp $ 
    * 
    *------------------------------------------------------------------------- 
    */ 
    #ifndef BLOCK_H 
    #define BLOCK_H 

    /* 
    * BlockNumber: 
    * 
    * each data file (heap or index) is divided into postgres disk blocks 
    * (which may be thought of as the unit of i/o -- a postgres buffer 
    * contains exactly one disk block). the blocks are numbered 
    * sequentially, 0 to 0xFFFFFFFE. 
    * 
    * InvalidBlockNumber is the same thing as P_NEW in buf.h. 
    * 
    * the access methods, the buffer manager and the storage manager are 
    * more or less the only pieces of code that should be accessing disk 
    * blocks directly. 
    */ 
    typedef uint32 BlockNumber; 

    #define InvalidBlockNumber  ((BlockNumber) 0xFFFFFFFF) 

    #define MaxBlockNumber   ((BlockNumber) 0xFFFFFFFE) 

    /* 
    * BlockId: 
    * 
    * this is a storage type for BlockNumber. in other words, this type 
    * is used for on-disk structures (e.g., in HeapTupleData) whereas 
    * BlockNumber is the type on which calculations are performed (e.g., 
    * in access method code). 
    * 
    * there doesn't appear to be any reason to have separate types except 
    * for the fact that BlockIds can be SHORTALIGN'd (and therefore any 
    * structures that contains them, such as ItemPointerData, can also be 
    * SHORTALIGN'd). this is an important consideration for reducing the 
    * space requirements of the line pointer (ItemIdData) array on each 
    * page and the header of each heap or index tuple, so it doesn't seem 
    * wise to change this without good reason. 
    */ 
    typedef struct BlockIdData 
    { 
     uint16  bi_hi; 
     uint16  bi_lo; 
    } BlockIdData; 

回答

3

一个通常应当使用(这些在C99定义,头文件stdint.h)被命名为喜欢uint32_t的类型。所有其他人都是非标准的,如果可以的话应该避免。现在,在你的情况,你不能避免非标类:-)因此,为了使你的代码编译,你需要非标准名称通用的标准是这样地图:

typedef uint32_t uint32; 

您需要为PostgreSQL中使用的所有类型添加此映射。一种方法是将它们添加到预编译头文件(.pch)文件中,或者使用这些typedefs创建头文件,然后再包含PostgreSQL头文件。

+0

我有'socklen_t'未知类型名称的类似问题。这个变量在socket.h中定义,但不在工作区中。我尝试在标题搜索路径中添加路径,但没有任何更改。 – Ava 2012-03-19 03:04:59

0

uint32应该是UInt32。您将要调整的名称或:

typedef UInt32 uint32; 
typedef uint32 BlockNumber; 
+0

'UInt32'也是非标准的。 'uint32_t'是要使用的(它在C99中定义,即使它是可选的,它应该在每个系统上都可用)。 – DarkDust 2012-03-08 18:55:00