什么时候是:typedef __intn_t(__INTPTR_WIDTH__) intptr_t;合法的?而且,为什么?
Posted
技术标签:
【中文标题】什么时候是:typedef __intn_t(__INTPTR_WIDTH__) intptr_t;合法的?而且,为什么?【英文标题】:When is: typedef __intn_t(__INTPTR_WIDTH__) intptr_t; legal? And, why? 【发布时间】:2016-02-14 23:31:05 【问题描述】:我最近意识到我的 Mac(来自终端)上的“gcc”和“clang”正在 Xcode 目录中搜索简单的包含文件,例如
一些搜索显示 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) (抱歉,这是一个 sn-p ...*** 拒绝了我所有尝试将代码粘贴到 ... 手动(4 个空白前缀)或单击“代码”按钮 ...不断出现删除换行符,重新格式化文本)。
【问题讨论】:
似乎是clang之类的扩展。 你能告诉我们cc -E file.c
的输出,其中file.c
只包含#include <stdint.h>
吗?
__intn_t
是否在某处定义为宏?类似#define __intn_t(_N) __intn_t_(_N)
#define __intn_t_(_N) int##_N##_t
@FUZxxl:*** 不允许我粘贴 870 个字符的评论,所以我将尝试编辑主要问题以将其添加到末尾。
@rici 好点。它是:#define __intn_t(n) __stdint_join3(int, n, _t)
【参考方案1】:
rici指出的问题答案,谢谢。 tcc 没有预定义 INTPTR_WIDTH,因此 __intn_t(n) 未能按预期扩展。
我没有看到“这回答了它”按钮,所以我点击了“这有帮助”。
谢谢!
【讨论】:
以上是关于什么时候是:typedef __intn_t(__INTPTR_WIDTH__) intptr_t;合法的?而且,为什么?的主要内容,如果未能解决你的问题,请参考以下文章
“typedef __u16 __bitwise __le16;”是啥意思?在Linux内核中是啥意思?
错误:未知类型名称 '__darwin_wctype_t' typedef __darwin_wctype_t wctype_t 在 MacOS 上使用 Clang 编译
typedef void (*funcptr)(void) typedef void (*PFV)(); typedef int32_t (*PFI)();