Tag: stringification

GNU C预处理器:对宏评估的结果进行字符串化

我有一个常见的字符串宏,我想转换为长度值字符串,所有这些都在宏中,如果可能的话,所以一切都以.rodata 。 #define PAYLOAD “xyz” #define PAYLOAD_LEN (sizeof(PAYLOAD)-1) 我想将PAYLOAD_LEN用作字符串,作为另一个字符串的一部分,例如 const char lv_macro[] = “” PAYLOAD_LEN “:” PAYLOAD; const char lv_wanted[] = “3:xyz”` 我怀疑这是不可能的,我应该将PAYLOAD_LEN定义为文字,例如#define PAYLOAD_LEN 3然后进行字符串化 。 我可以,但不想,忘记.rodata并在运行时生成它,例如 char lv[64]; snprintf(lv, sizeof lv, “%zu:” PAYLOAD, PAYLOAD_LEN); 请注意,这不是已经在此处提出和回答的问题,例如,以及许多其他问题。

C编程:预处理器,宏作为标记

我正在尝试做一些概念上与此相似的事情,但似乎无法让它发挥作用(最后显示的错误)任何想法? #include int main( int argc , char const *argv[] ) { int abc_def_ghi = 42; #define SUFFIX ghi #define VAR(prefix) prefix##_def_##SUFFIX printf( “%d\n” , VAR(abc) ); return 0; } // untitled:8: error: ‘abc_def_SUFFIX’ undeclared (first use in this function)

字符串化第一级宏扩展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)” ?

使用%s格式化时的#是什么

我遇到了这个断言的例子,并想知道#是什么: #define ASSERT( x ) if ( !( x ) ) { \ int *p = NULL; \ DBGPRINTF(“Assert failed: [%s]\r\n Halting.”, #x); \ *p=1; \ }

令牌贴在C中

看完VA_NARG后 我尝试使用宏根据C中的参数数量实现函数重载。 现在的问题是: void hello1(char *s) { … } void hello2(char *s, char *t) { … } // PP_NARG(…) macro returns number of arguments :ref to link above // does not work #define hello(…) hello ## PP_NARG(__VA_ARGS__) int main(void) { hello(“hi”); // call hello1(“hi”); hello(“foo”,”bar”); // call hello2(“foo”,”bar”); return 0; } 我从C-faq那里读到了这个 。 但仍然无法让它工作……

为什么ENOUGH就足够了? (将int存储在char数组中)

在关于如何在C中将int转换为字符串 的答案之一 (及其注释)中给出了以下解决方案 char str[ENOUGH]; sprintf(str, “%d”, 42); 在评论中, ENOUGH提到ENOUGH可以在编译时确定: #define ENOUGH ((CHAR_BIT * sizeof(int) – 1) / 3 + 2) 我得到+ 2因为你需要能够显示减号和空终止符但是其他部分背后的逻辑是什么? 特别是CHAR_BIT ?

C预处理器通过串联和字符串化生成宏

我有一组目标宏,我想根据选择的宏生成别名,如下所示: 选择宏: #define I2C_MODULE 1 别名宏(概念forms): #define I2C_MODULE_BASE I2C_BASE #define I2C_MODULE_NVIC INT_I2C 目标宏(来自我控制的外部文件): #define INT_I2C0 24 #define INT_I2C1 53 … #define I2C0_BASE 0x40020000 #define I2C1_BASE 0x40021000 … 我希望让预处理器根据选择的宏I2C_MODULE生成别名宏I2C_MODULE_BASE和I2C_MODULE_NVIC ,但是经过多次读取Q1 , P1和许多其他参考我失去了跟踪,我最终硬编码了它们的值。 下面我展示了我当前的工作定义,然后是我上次生成宏的失败尝试: 什么有效: #define I2C_MODULE 1 #define I2C_MODULE_BASE I2C1_BASE #define I2C_MODULE_NVIC INT_I2C1 什么没有奏效: #define I2C_MODULE 1 #define STR_HELPER(x) #x #define STR(x) STR_HELPER(x) /* Attempt 1 […]

在##连接之前评估预处理程序令牌

我想在它与其他东西连接之前评估一个令牌。 “问题”是标准将行为指定为 在重新检查替换列表以更换更多宏名称之前,删除替换列表中的##预处理标记的每个实例(不是来自参数),并将前面的预处理标记与以下预处理标记连接起来。 因此在下面的例子中, #include struct xy { int x; int y; }; struct something { char * s; void *ptr; int size; struct xy *xys; }; #define ARRAY_SIZE(a) ( sizeof(a) / sizeof((a)[0]) ) #define DECLARE_XY_BEGIN(prefix) \ struct xy prefix ## _xy_table[] = { #define XY(x, y) {x, y}, #define DECLARE_XY_END(prefix) \ {0, 0} \ […]

C预处理器:stringize宏和身份宏

我想知道这段代码输出背后的原因。 我无法想出答案。 #define f(a,b) a##b #define g(a) #a #define h(a) g(a) void main() { printf(“%s %s”,h(f(1,2)),g(f(1,2))); } PS:输出为12 f(1,2) 。 我以为它是12 12或f(1,2) f(1,2) 。

我可以用宏的一些技巧?

在我们的遗留代码中,以及我们的现代代码中,我们使用宏来执行代码生成等的漂亮解决方案。我们使用#和##运算符。 我很好奇其他开发人员如何使用宏来做很酷的事情,如果他们根本使用它们的话。