【问题标题】:typedef and #define with same nametypedef 和 #define 同名
【发布时间】: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 大脑无法理解为什么这个问题应该涵盖我的特定情况。

感谢您的宝贵时间!

【问题讨论】:

标签: c cygwin c-preprocessor typedef ksh


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多