typedef和#define同名

时间:2016-12-07 23:22:16

标签: c cygwin c-preprocessor typedef ksh

一点背景:

我试图将我在Solaris上运行的一些.ksh文件移植到使用Cygwin在Windows上运行。在Solaris机器上运行的ksh实现与可以在Cygwin中轻松安装的pdksh实现之间存在差异,处理子shell - 如果您愿意,可以查看this question详细信息。

由于存在这种差异,我尝试构建找到here的AST工具包,因为根据this question,AT& T不再提供二进制文件。

我的问题:

当我尝试按照GitHub网站上的说明进行构建时,我最终编译了一个名为fastfind.c的文件时出错:

+ cc -D_BLD_STATIC -D_BLD_DLL -D_BLD_ast -I. -I/ast-master/src/lib/libast -Icomp -I/ast-master/src/lib/libast/comp -Imisc -I/ast-master/src/lib/libast/misc -Iinclude -I/ast-master/src/lib/libast/include -Istd -I/ast-master/src/lib/libast/std -D_PACKAGE_ast -c /ast-master/src/lib/libast/misc/fastfind.c,
In file included from /ast-master/src/lib/libast/std/stdio.h:22:0,
    from ./ast_wchar.h:87,
    from /ast-master/src/lib/libast/include/regex.h:39,
    from /ast-master/src/lib/libast/misc/findlib.h:35,
    from /ast-master/src/lib/libast/misc/fastfind.c:77:
./ast_stdio.h:82:15: error: conflicting types for '_sfio_FILE'
 #define FILE  _sfio_FILE
               ^
./ast_stdio.h:80:24: note: previous declaration of '_sfio_FILE' was here
 typedef struct _sfio_s _sfio_FILE;
                        ^
mamake [lib/libast]: *** exit code 1 making fastfind.o

文件ast_stdio.h的第80-82行如下:

80: typedef struct _sfio_s _sfio_FILE;
81:
82: #define FILE        _sfio_FILE

此外,ast_stdio.h文件的顶部有:

/* : : generated by proto : : */
/* : : generated from /ast-master/src/lib/libast/features/stdio by iffe version 2012-07-17 : : */

最后,这是我的相关cc信息:

$ cc --version
cc (GCC) 5.4.0

一个小小的免责声明:我的C生锈了,因为我在过去的14年里一直是个Java人。我的理解是#define指令由预处理器进行评估,因此第82行基本上会用代码中的_sfio_FILE替换字符串FILE,并且在实际编译之前不会评估typedef行。

显然我错了,或者这个错误不会发生。很明显,这段代码可以为某人编译,也可能不会以这种方式发布。任何关于这里发生了什么以及如何使这个文件编译的见解都值得赞赏。我发现this question似乎与我提出的问题很接近,但我的案例和问题之间存在不同之处,或者我的C脑无法理解为什么问题应该涵盖我的具体情况。

谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

错误是由于glibc的变化。有关更多信息,请参阅Red Hat Bugzilla#1477082以及需要对源文件进行哪些更改。