什么时候:typedef __intn_t(__ INTPTR_WIDTH__)intptr_t;法律?而且,为什么?

时间:2016-02-14 23:31:05

标签: c xcode

我最近意识到我的Mac上的“gcc”和“clang”(来自终端)正在Xcode目录中搜索简单的包含文件,例如< stdarg.h>。
我发现当一些简单的有效程序(在gcc / clang下)无法用tcc(Tiny C)编译时因为< stdarg.h>在/ usr / include下找不到。

有些搜索显示gcc和clang表现得好像有暗示:

-I /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.2/include 

并且,确实stdarg.h位于该目录下。 (顺便说一下,我的ENV变量中没有任何东西有这样的路径。)

我提供了tcc的路径,我的程序仍然没有编译,因为在Xcode的stdint.h中有趣的行上弹出了一个错误

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin /../ lib / clang / 7.0.2 / include / stdint.h具有以下内容:

typedef  __intn_t(__INTPTR_WIDTH__)  intptr_t;

(和“__INTPTR_WIDTH__”显然是由编译器在-m64下隐式定义为64,在-m32下为32)。

然而,这似乎扩展为:

typedef __intn_t(64)  intptr_t;

如果我尝试使用这样的行进行clang或gcc,我会得到(正如我所料)语法错误,就像我使用tcc一样。

如果有人能告诉我为什么/这条线何时有效,我会很感激。

感谢,

斯坦

cc -E fum.c(El Capitan,Apple LLVM 7.0.2版(clang-700.1.81))

   # 1 "fum.c"
   # 1 "<built-in>" 1
   # 1 "<built-in>" 3
   # 325 "<built-in>" 3
   # 1 "<command line>" 1
   # 1 "<built-in>" 2
   # 1 "fum.c" 2
   # 1 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.2/include/stdint.h" 1 3 4
   # 63 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.2/include/stdint.h" 3 4
   # 1 "/usr/include/stdint.h" 1 3 4
   
   ...250 lines deleted, going in/out of stdint.h, finally dropping back to line 64 of the Xcode version...
   
   # 60 "/usr/include/stdint.h" 2 3 4
   # 64 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.2/include/stdint.h" 2 3 4
   # 2 "fum.c" 2

(就是这样,fum.c由一行组成:#include) (对不起,这是一个片段... stackoverflow抵制我所有尝试粘贴代码...手动(4个空白前缀)或点击'代码'按钮...不断删除换行符,文本重新格式化)。

1 个答案:

答案 0 :(得分:1)

rici指出的问题答案,谢谢。 tcc没有预定义 INTPTR_WIDTH ,因此__intn_t(n)无法按预期扩展。

我没有看到“这个回答”按钮,所以我点击了“这有帮助”。

谢谢!