Tag:

可变宏中令牌的连接

在C中,是否可以在可变参数宏中连接每个变量参数? 例: MY_MACRO(A, B, C) // will yield HDR_A, HDR_B, HDR_C MY_MACRO(X, Y) // will yield HDR_X, HDR_Y 正常的##运算符对于可变参数宏具有特殊含义(避免使用空参数列表的逗号)。 与__VA_ARGS__一起使用时,串联只与第一个令牌一起发生。 例: #define MY_MACRO(…) HDR_ ## __VA_ARGS__ MY_MACRO(X, Y) // yields HDR_X, Y 建议?

MAX使用gcc的typeof扩展名

我已经用C语言编程了很长一段时间。所以我决定学习一些关于gcc编译器扩展的高级CI。我看到了MAX()的代码,我现在已经实现如下 #define MAX(x,y) ((x) > (y)? (x): (y)) 这是我发现的新定义。遗憾的是,我甚至无法理解下面的代码是做什么的? 为什么我会这样做,而不是如上所述? #define MAX(a,b) \ ({ \ typeof (a) _a = (a); \ typeof (b) _b = (b); \ _a > _b ? _a : _b; })

在C中的Typechecking宏参数

是否可以对#define宏进行类型检查? 例如: typedef enum { REG16_A, REG16_B, REG16_C }REG16; #define read_16(reg16) read_register_16u(reg16); \ assert(typeof(reg16)==typeof(REG16)); 上面的代码似乎不起作用。 我究竟做错了什么? 顺便说一下,我正在使用gcc,我可以保证在这个项目中我将一直使用gcc。 代码不需要是可移植的。

用于探索由c / c ++编写的宏的vim插件

有没有可以在vim中扩展c / c ++宏的插件? 比如Netbeans呢?

#运算符在宏中做了什么?

#include #define foo(x, y) #x #y int main() { printf(“%s\n”, foo(k, l)); return 0; } 输出: kl 我知道##会连接。 从输出看来#似乎也是连接。 我对么? 如果我是正确的那么##运算符和#运算符之间有什么区别?

C预处理器使用父宏的右括号

我有这个代码有效: #include #define A(x) x B #define B(x) C(x, #define C(x,y) yx) int main( void ) { printf( A(“1”) (“2”) “3” ); } 它打印132 ( A宏的点是交换括号中跟随其参数的东西,之后的所有内容,直到另一个结束括号) 但如果我在另一个宏中使用它: #define Z(x) x printf( Z( A(“1”) (“2”) “3” ) ); 我得到编译错误“未终止的函数式宏调用”。 我意识到这是因为编译器试图独立处理Z的参数,但我需要使用它的右括号作为标记。 有没有办法让我在宏中工作? 更改调用语法实际上不是一个选项。 ps在我得到任何回复谈论这是多么糟糕的事情之前,请放心:这不是真正的代码。 制作玩具程序时出现了一个问题,该程序使用define来模拟C语言中的新语言。

你能帮我一个可以打印的简短代码吗?

#define q(k)main(){return!puts(#k”\nq(“#k”)”);} q(#define q(k)main(){return!puts(#k”\nq(“#k”)”);}) 这段代码可以在屏幕上打印出来,但是我很难阅读它,特别是那两个#K,它是如何工作的?我知道#define q(k)2 * k是如何工作的,但我真的不知道关于这段代码。请帮我分析一下!谢谢!

如何在跨文件预处理时获取唯一值

问题 我需要一种使用预处理器指令生成唯一值的方法。 目的是每次调用宏时,它将具有唯一的整数标识符。 但它应该保留它跨文件的价值。 有点像预处理器计数器,用于调用函数的次数。 更进一步的信息 我正在使用的宏是: #define LOG_MSG(a) log_msg(?) ‘a’是用户想要打印的字符串。 log_msg是一个用于在UART上打印消息的自定义函数 ‘?’ 如果我需要帮助的部分。 该宏仅在一个地方定义。 在预处理阶段,’?’ 将被唯一标识符替换。 我们这样做是为了减少字符串带来的开销,因为此代码将在嵌入式设备上运行。 在预处理之后,将提取标识符和相关字符串,并且将创建将映射它们的表(这将在应用程序侧)。 由于这将用于多个文件,我想要一种方法来为多个文件中的每次使用生成唯一标识符( 整数而不是字符串 )(每个唯一字符串的标识符将是理想的但不是必需的)。 有任何想法吗? 如果有任何遗漏或不完整的信息,请提及 笔记 __COUNTER__是我尝试的第一件事,但它并不适用于文件。 __FILE__会给我一个破坏目的的字符串。 有人提到使用唯一文件标识符。 但我不想静态分配这些。 我们正在使用CCS(它基于Eclipse Kepler构建)来构建此代码。 所以我想我们可以在构建系统中添加一些内容来执行@embedded_guy所提到的内容。 谁知道怎么做? 谢谢

如何重命名C预处理器宏?

考虑一个(只读第三方)头lib.h : #define XYZ 42 在源文件中,我想将XYZ这个词用于不相关的目的,并且不希望用42替换。 但是,在同一个源文件中,出于其他目的,我也想从lib.h访问值42而不lib.h进行硬编码。 如何将宏从XYZ 重命名为LIB_XYZ ? 以下方法不起作用,因为预处理器LIB_XYZ替换时需要XYZ ,但XYZ未定义: #include “lib.h” #define LIB_XYZ XYZ #undef XYZ 有没有办法欺骗预处理器在XYZ丢失之前将LIB_XYZ扩展到其最终值?

用于计算存储数字n所需的位数的宏

假设我需要编写C宏来返回存储无符号32位整数所需的位数(1..32)。 (结果等于上限(log2(n))。 我需要它作为编译时计算宏,而不是函数。 我可以 #define NBITS(n) ((n)&(1<<31)?32:(n)&(1<<30)?31:… 它有效,但相当长。 (速度与此无关,计算在编译时)。 有没有更短的方法来编写这个宏? 最短的?