代码之家  ›  专栏  ›  技术社区  ›  Mr Pang

我可以在C中键入def struct aaa struct x_aaa吗?

c
  •  1
  • Mr Pang  · 技术社区  · 6 年前

    我用的是公共图书馆。在较新版本中,它将其结构从struct aaa更改为struct x_aaa。 我想让我的代码通行证在任何版本的库中编译。 所以我想这样做:

    #if lib_ver > 20000
    typedef struct x_aaa struct aaa;
    #endif
    

    然后在后面的代码中使用strut aaa。但这不管用。你怎么解决这个问题?

    3 回复  |  直到 6 年前
        1
  •  3
  •   molbdnilo    6 年前

    typedef名称必须是单个标识符,因此不能这样做。
    (typedef的格式与变量声明的格式相同,前面添加了单词“typedef”。)

    您可以根据版本使用typedef

    #if lib_ver > 20000
        typedef struct x_aaa lib_aaa;
    #else
        typedef struct aaa lib_aaa;
    #endif
    

    并更改代码以使用 lib_aaa 而不是完整的结构名称。

    也可以使用宏,但最好避免使用它们:

    #if lib_ver > 20000
        #define aaa x_aaa;
    #endif
    

    尽管如此,重命名听起来可能是一个突破性的改变,即使你让你的代码编译。
    我会非常小心的。

        2
  •  1
  •   LoPiTaL    6 年前

    你不能 typedef 一 struct something 进入之内 struct something_else .

    你能做的就是 类型定义 一 构造某物 进入之内 something_else (删除单词 struct ).

    如果这不是你想要的,你应该用一个简单的 #define :

    #define aaa x_aaa
    
        3
  •  0
  •   pmg    6 年前
    typedef struct aaa bbb;
    //      ^^^^^^^^^^      source type
    //                 ^^^  new identifier
    

    对于现有类型,新的标识符不能是“结构体”。

    您可能需要更改代码,以反映您使用的结构在库的所有版本中都不相同

    #if lib_ver > 20000
    #typedef struct x_aaa libaaa
    #else
    #typedef struct aaa libaaa
    #endif
    
    // in your code use `libaaa` instead of `struct aaa`
    //struct aaa foo;
    libaaa foo;
    //struct x_aaa bar;
    libaaa bar;