Tag:

仅评估一次宏参数

在下面的代码中,任何传递为retval被评估为每次使用该令牌时给出的内容。 #define _CPFS_RETURN(commit, retval) do { \ util_cpfs_exit(commit); \ return retval; \ } while (false) #define CPFS_RETURN_BOOL(retval) do { \ _CPFS_RETURN(retval, retval); \ } while (false) 例如,给定使用CPFS_RETURN_BOOL(inode && file_truncate(inode, len)); ,这是生成的: do { do { util_cpfs_exit(inode && file_truncate(inode, len)); return inode && file_truncate(inode, len); } while (0); } while (0); 显然我不想执行语句inode && file_truncate(inode, len); 不止一次。 […]

getc()作为宏和C标准库函数定义,连贯吗?

在[7.1.4库函数的使用]中 ,我读到: 标题中声明的任何函数可以另外实现为标题中定义的函数式宏… 和 任何实现为宏的库函数的调用都应扩展为仅对其每个参数进行一次计算的代码… 然后对于getc , [7.21.7.5 getc函数] : getc函数等效于fgetc,除非它实现为宏,它可能会多次评估流,因此参数永远不应该是带有副作用的表达式。 getc的定义是: 与库函数定义相矛盾? 反过来? 这是标准中的不连贯吗? 或者这是否意味着如果getc完全实现(似乎不符合但是?)作为宏,它可能会两次评估它的参数?

在结构中定义宏的逻辑是什么?

正如标题中所显示的,我正在质疑在结构中定义宏的原因。 我经常在网络编程中看到这种方法,例如以下片段: struct sniff_tcp { u_short th_sport; /* source port */ u_short th_dport; /* destination port */ tcp_seq th_seq; /* sequence number */ tcp_seq th_ack; /* acknowledgement number */ u_char th_offx2; /* data offset, rsvd */ #define TH_OFF(th) (((th)->th_offx2 & 0xf0) >> 4) u_char th_flags; #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 #define […]

为什么在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)” ?

C编程#define?

可能重复: 谁能解释这些未定义的行为(i = i ++ + ++ i,i = i ++等…) #include #include #define SQ(x) x*x void main() { int a1 , a2; int b1 , b2; a1 = 2; a2 = 2; b1 = 0; b2 = 0; b1 = SQ(a1++); b2 = SQ(++a2); printf(“Frist = %d”,b1); printf(“Second = %d”,b2); } 我知道代码的输出是什么。 因为#define在其他程序中工作,所以它不能在上面的代码中工作为什么。?

宏依赖宏

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

使用宏“优秀实践”定义数组的长度?

我正在编写一本名为“ C编程:现代方法”的书 ,在讨论数组的第一部分中,作者指出: 使用宏来定义数组的长度是很好的做法 然后使用简短的例子: #define N 10 … int a[N]; 我知道它与能够回到程序的源代码并更改值有关,并使其成为宏可能使程序员更容易,但我不确定。 为什么这是一个很好的做法,还是客观的?

如何在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 […]

使用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) […]