【发布时间】:2017-04-23 02:05:24
【问题描述】:
一点背景:
我正在尝试移植一些在 Solaris 上运行的 .ksh 文件,以便使用 Cygwin 在 Windows 上运行。在 Solaris 机器上运行的 ksh 实现与在处理子 shell 的 Cygwin 中易于安装的 pdksh 实现之间存在差异 - 如果您愿意,可以查看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 --version
cc (GCC) 5.4.0
一点免责声明:我的 C 语言已经生锈了,因为过去 14 年来我一直是 Java 人。我的理解是 #define 指令由预处理器进行评估,因此第 82 行本质上将在代码中将字符串 FILE 替换为 _sfio_FILE,并且在实际编译之前不会评估 typedef 行。
显然我错了,否则这个错误不会发生。很明显,这段代码是为某人编译的,否则就不会以这种方式发布。任何关于这里发生的事情以及如何编译这个文件的见解都值得赞赏。我找到了this question,这似乎与我要问的内容很接近,但是我的案例和那个问题之间有一些不同,或者我的 C 大脑无法理解为什么这个问题应该涵盖我的特定情况。
感谢您的宝贵时间!
【问题讨论】:
-
也许使用#undef ?
-
您能提供一个 MCVE 吗? stackoverflow.com/help/mcve
标签: c cygwin c-preprocessor typedef ksh