Dmitri Gribenko <griboz...@gmail.com> wrote on 06/02/2016 06:19:33 PM:
>
> Could you check if there are multiple definitions of off_t or mode_t
> in different headers guarded by macros?  Something like this,
> duplicated across several headers:
>
> #if !defined(_OFF_T_DEFINED)
> typedef __off_t off_t;
> #define _OFF_T_DEFINED
> #endif
>
> This is a frequent pattern used in C headers, but it is an antipattern
> for modules.  With modules, all headers that are included into the
> module get #included into a single translation unit and compiled into
> a module, so only one of those typedefs will get activated (let's say
> in foo.h), and the other one will get hidden because it is seen second
> in the translation unit (let's say the one in bar.h gets hidden).  If
> you then import just the submodule for bar.h, the off_t definition
> won't be visible, because it was #ifdef'ed out.
>
> There are fragile solutions to this (like including a header that
> happens to fix the build this time), but the only real fix is to make
> sure that there is only one place where a declaration can be located
> in a module, regardless of the set of headers.
>

Thanks for the response Dmitri.  Yes this is indeed the case.  On my Ubuntu
15.10 system there are conditional typedefs of this flavor in
5 /usr/include/* header files for mode_t and in 6 header files for off_t.

What do you recommend I should try to work around the messy state of the
system headers?

--dave
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to