C库 - 在C++中使用:重定义,不同的类型修饰符

inz*_*nez 1 c++ typedef redefinition

我最近在纯C中构建了一个CSV库.头文件如下所示:

  #ifndef CSV_H
  #define CSV_H

    #include "unicode/ustdio.h"
    #include "unicode/uchar.h"
    #include "unicode/ucsdet.h"
    #include "unicode/ustring.h"

    #define T CSV_T
    typedef struct T *T;

    extern T    CSV_new(char *filename);
    extern void CSV_free(T *csv);
    extern int  CSV_length(T csv);
    extern void CSV_print_info(T csv);
    extern UChar **CSV_get_header(T csv);
    extern UChar ***CSV_get_values(T csv);
    extern long CSV_get_num_columns(T csv);
    extern long CSV_get_num_lines(T csv);
    extern char *CSV_get_charset(T csv);

    #undef T
    #endif
Run Code Online (Sandbox Code Playgroud)

struct CSV_T的实际定义在代码文件中完成,以隐藏实现.我经常在使用纯C的不同项目中使用该库,没问题.现在我想在使用C++构建的GUI应用程序中重用代码,并收到以下错误消息:

Error   C2373   'CSV_T': redefinition; different type modifiers     ... xxx\Projects\LibCSV\LibCSV\csv.h    10  
Run Code Online (Sandbox Code Playgroud)

C++是否处理了与C不同的typedef?混淆不清,......

Lig*_*ica 5

以下是您的MCVE应该是什么样子:

typedef struct T *T;
Run Code Online (Sandbox Code Playgroud)

这是一个完整的单行源文件,可以重现该问题并且没有依赖关系.没有宏,没有标题,没有不必要的代码.

g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp:1:19: error: conflicting declaration 'typedef struct T* T'
 typedef struct T *T;
                   ^
main.cpp:1:16: note: previous declaration as 'struct T'
 typedef struct T *T;
            ^
Run Code Online (Sandbox Code Playgroud)

它在C中工作的原因是它T不是结构的名称; 你需要struct前缀.

在C++中,情况并非如此,因为struct首先不需要前缀.一旦你宣布这T是一个类(令人困惑的是,你自己做了typedef!),你不能只提供一些其他类型(你试图用它创建的那个typedef)同名.

这是相当奇怪的,你在做什么,反正,使得CSV_T平均struct CSV_T*.我建议不要这样做.

如果你只是坚持使用typedef struct CSV_T CSV_T那么这将适用于两种语言,但尝试使用相同的名称制作不同的类型是不行的.