我不知道typedef和#define在c中是一样的吗?
是否有一行macros定义来确定机器的字节顺序。 我正在使用下面的代码,但将其转换为macros将太长。 unsigned char test_endian( void ) { int test_var = 1; unsigned char test_endian* = (unsigned char*)&test_var; return (test_endian[0] == NULL); }
我刚刚了解到X-Macros 。 你看过X-Macros的真实用途了吗? 他们什么时候是正确的工具?
可能重复: 当我们定义一个macros的时候,(0)有什么用呢? 为什么在C / C ++macros中有没有意义的do / while和if / else语句? 做{…} while(0)有什么好处? 我已经看到了一些多线C语言macros,这些macros被封装在一个do / while(0)循环中,如下所示: #define FOO \ 做{\ do_stuff_here \ do_more_stuff \ (0) 与使用基本块相比,以这种方式编写代码有什么好处(如果有的话): #define FOO \ {\ do_stuff_here \ do_more_stuff \ }
可能重复: C / C ++macros中的Do-While和if-else语句 我正在读linux内核,并且发现了很多像这样的macros: #define INIT_LIST_HEAD(ptr) do { \ (ptr)->next = (ptr); (ptr)->prev = (ptr); \ } while (0) 为什么他们使用这个而不是简单地在{}中定义它?
我有两个macrosFOO2和FOO3 : #define FOO2(x,y) … #define FOO3(x,y,z) … 我想要定义一个新的macrosFOO ,如下所示: #define FOO(x,y) FOO2(x,y) #define FOO(x,y,z) FOO3(x,y,z) 但是这不起作用,因为macros不会超过参数的数量。 在没有修改FOO2和FOO3 ,是否有某种方法来定义macrosFOO (使用__VA_ARGS__或其他方法)以获得将FOO(x,y)分配到FOO2和FOO(x,y,z)到FOO3的相同效果?
我一直在挖掘Linux内核的一些部分,并发现这样的调用: if (unlikely(fd < 0)) { /* Do something */ } 要么 if (likely(!err)) { /* Do something */ } 我find了他们的定义: #define likely(x) __builtin_expect((x),1) #define unlikely(x) __builtin_expect((x),0) 我知道他们是为了优化,但他们是如何工作的? 使用它们可以预期性能/尺寸会下降多less? 至less在瓶颈代码(当然是在用户空间),这是否值得麻烦(并且可能丢失可移植性)。
我试图在下面的代码中使用macrosSQR的定义: #define SQR(x) (x*x) int main() { int a, b=3; a = SQR(b+5); // Ideally should be replaced with (3+5*5+3), though not sure. printf("%d\n",a); return 0; } 它打印23 。 如果我将macros定义更改为SQR(x) ((x)*(x))那么输出如预期的那样为64 。 我知道C中的一个macros的调用用macros的定义来替代调用,但我仍然不明白,它是如何计算的23 。