Tag: c preprocessor

为什么在SUCCEEDED宏中有这么多括号?

Windows SDK具有SUCCEEDED宏: #define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0) ———————–^————-^—– 与其他宏一样,有一些括号可以确保编译器正确解释意图。 我没有得到的是为什么周围有括号(HRESULT)(hr) (我用^字符标记它们)。 hr括号括起来,以便有一些复杂的构造可以存在, HRESULT被括号括起来形成一个C风格的HRESULT转换,然后整个>=构造也被括号括起来,那么为什么额外的一对括号(HRESULT)(hr)呢?

字符串化第一级宏扩展C.

是否可以对此C宏进行字符串化: #define GPIO_INT_PIN (GPIO_PORT_D|GPIO_PIN_IRQ_RISING|GPIO_PIN5) 使用类似的东西 MY_STRINGFY(GPIO_INT_PIN) 要得到 “(GPIO_PORT_D|GPIO_PIN_IRQ_RISING|GPIO_PIN5)” ?

ISO 8601:2004中的C预处理器__TIMESTAMP__

如何在ISO 8601:2004中更换__TIMESTAMP__ ? __TIMESTAMP__ Sat Jul 6 02:50:06 2013 VS __TIMESTAMP_ISO__ 2013-07-06T00:50:06Z

宏依赖宏

有可能做这样的事情: #define F(x) \ #ifdef DOUBLE \ 2*x \ #else \ x \ #endif 所以当我使用F ,它扩展到什么取决于是否定义了宏DOUBLE ? 我不这么认为,但我很有希望。 GNU扩展很好。 编辑为了回答一些答案,我实际上是用它来做一些代码生成,其中代码略有不同,具体取决于它的定义位置。 由于包含某些文件的顺序以及需要定义相关宏的位置,以此方式切换它需要一些因子。 我可能不得不这样做,但如果我不必从这个角落重新点燃自己,我会很激动!

如何知道是否定义了__uint128_t

我们可以使用预处理器来知道是否定义了unsigned long long : #include #ifndef ULLONG_MAX typedef unsigned long t_mask; #else typedef unsigned long long t_mask; #endif 但是如何知道是否定义了__uint128_t?

如何在C中解析链式宏?

如果我想使用预处理程序#define语句来轻松定义和计算常量和常用函数,并利用较少的RAM开销(而不是使用const值)。 但是,如果使用多个宏,我不确定它们是如何解决的。 我正在设计自己的DateTime代码处理,类似于linux时间戳,但对于一个代表1/60秒的tick更新的游戏。 我更愿意声明链接的值,但想知道硬编码值是否会更快。 #include // my time type, measured in 1/60 of a second. typedef int64_t DateTime; // radix for pulling out display values #define TICKS_PER_SEC 60L #define SEC_PER_MIN 60L #define MIN_PER_HR 60L #define HRS_PER_DAY 24L #define DAYS_PER_WEEK 7L #define WEEKS_PER_YEAR 52L // defined using previous definitions (I like his style, write once!) #define […]

使用#define重新定义枚举枚举器

我在C头文件中发现了一些我无法弄清楚是什么的东西。 例如,在文件bits/socket.h有一个枚举类型enum __socket_type ,但是在每个枚举器之后都有一个定义宏的定义宏。 例: enum __socket_type { SOCK_STREAM = 1, #define SOCK_STREAM SOCK_STREAM … }; 我一直无法知道这是为了什么。 请赐教。 我甚至不知道如何形成正确的问题来查询谷歌或这个网站搜索框。

使用C预处理器进行嵌套宏迭代

使用C预处理器,您可以拥有某种高阶宏。 像这样的东西: #define ABC(f) f(a) f(b) f(c) #define XY(f) f(x) f(y) #define CODE(x) foo_ ## x ABC(CODE) #undef CODE #define CODE(x) bar_ ## x XY(CODE) #undef CODE 输出是: foo_a foo_b foo_c bar_x bar_y 是否有一些技巧来嵌套这样的迭代,做这样的事情? #define CODE(x) foo_ ## x NEST(ABC, XY, CODE) #undef CODE 所以输出将是: foo_ax foo_ay foo_bx foo_by foo_cx foo_cy 特别是,我想让ABC和XY的定义相互独立,这样我仍然可以单独使用ABC ,或者甚至可以这样做: #define CODE(x) […]

任何人都可以在下面的例子中解释C预处理器的行为吗?

我正在实现一个C宏预处理器(C99)…… 我对以下行为感到惊讶…. EX1: #define PASTE(x)X _ ## x #define EXPAND(x)PASTE(x) #define TABSIZE 1024 #define BUFSIZE TABSIZE PASTE(BUFSIZE) EXPAND(BUFSIZE) 扩展为: X_BUFFSIZE X_1024 EX2: #define EXPAND(s)TO_STRING(s) #define TO_STRING(s)#s #define四个4 TO_STRING(四) EXPAND(四) 扩展到: “四个一” “4” 我已经完成了C的“免费”标准,但我找不到以下内容…… 实际上预处理器执行了多少次传递? 它首先替换一个宏,然后替换其他宏等等 或者它是否存储并替换为#define s逐个遇到? 文件包含是先完成还是宏扩展?

如何在预处理器中检测X32 ABI或环境?

X32是使用32位指针的amd64 / x86_64 CPU的ABI。 我们的想法是将较大的x86_64寄存器组与32位指针产生的较小内存和高速缓存占用空间相结合。 它提供高达约40%的加速。 有关详细信息并将其设置为chroot环境,请参阅Stack Overflow上的x86,x32和x64体系结构与Debian X32 Ports wiki页面之间的区别 。 我们在环境下有一个来自Debian维护者的错误报告。 报告是adcq是非法指令。 内联汇编是基于预处理器宏激活的,因此我们没有正确检测X32(或者更正确,直到现在都没有)。 对于预处理器宏,最明显的选择(对我来说)就像__X32__ ,但是没有提供。 基于Clang的补丁和Debian的建议 ,看起来可以使用__ILP32__ 。 但是我想要一个更规范的答案,因为_ILP32和__code_model_small__看起来也很有趣。 (我知道SSE2的问题,编译器支持它,但操作系统没有)。 在使用Clang和GCC时,可以使用哪些预处理器宏可靠地检测X32 ABI和环境? 要清楚,我现在不是要修改代码。 我只想知道可以在完全修复中使用的宏。 # cpp -dM < /dev/null | sort #define __amd64 1 #define __amd64__ 1 #define __ATOMIC_ACQ_REL 4 #define __ATOMIC_ACQUIRE 2 #define __ATOMIC_CONSUME 1 #define __ATOMIC_HLE_ACQUIRE 65536 #define __ATOMIC_HLE_RELEASE 131072 #define […]