【发布时间】:2016-07-14 10:10:41
【问题描述】:
我最近用纯 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
struct CSV_T 的实际定义是在代码文件中完成的,以隐藏实现。我经常在使用纯 C 的不同项目中使用该库,没问题。现在我想在使用 C++ 构建的 GUI 应用程序中重用代码,我收到以下错误消息:
Error C2373 'CSV_T': redefinition; different type modifiers ... xxx\Projects\LibCSV\LibCSV\csv.h 10
C++ 处理的 typedef 是否与 C 不同?莫名其妙地混淆了,...
【问题讨论】:
-
发布你的minimal reproducible example,而不是这个“...”废话
-
还有一点批评——你应该使用
const char*,你为什么要使用一个宏来代替已经很短的CSV_T来取代单字母T?这真的很糟糕。 -
typedef struct T *T对于 C++ 代码来说不是一个好主意。 -
给你。同意
const char *。该定义只是为了不同库之间的一致性。不好,好吧,但我已经习惯了,我想它不会伤害编译器,...:-) -
在您的错误报告中紧接发布的错误消息的那一行应该非常有启发性,向您展示之前的版本在哪里,以及实际的区别是什么。为什么你没有在你的问题中包含它仍然是一个谜。 “它不会伤害编译器”——显然 C++ 编译器不同意这种观点。
标签: c++ typedef redefinition