Tag: c预处理器

在宏中执行{} while(0)与if(1){}

可能重复: 为什么在C / C ++宏中有时会出现无意义的do / while和if / else语句? 当需要在预处理器宏中执行多个语句时,它通常被编写为 #define X(a) do { f1(a); f2(a); } while(0) 所以当这个宏在像这样的表达式中使用时: if (…) X(a); 它不会搞砸了。 问题是:无论我在哪里看过这样的表达,它总是do { … } while(0); 。 if (1) { … }是否有任何理由更喜欢这种观念(在我看来更清楚)? 或者我的观察结果是错误的,它们同样受欢迎?

macro:来自char literal的字符串文字

C中是否有一种方法可以使用宏从字符文字创建字符串文字? 比如我有 ‘a’ 我想创建字符串文字 “a” 澄清问题: #define A ‘a’ write(fd, “x=” CHAR2STRING(A) “\n”, 4); 我的问题是如何定义宏CHAR2STRING

计算C预处理器中两个代码位置之间的行数

我想使用C预处理器来计算两个代码位置之间的行数。 基本想法是这样的: #define START __LINE__ static char* string_list[] = { “some string”, “another string”, … “last string” }; #define END __LINE__ #if END – START > 42 #error Too many entries #endif 当然这不起作用,因为在这种情况下, START和END仅仅是__LINE__宏的重新定义。 我正在使用#和##运算符,但是在预处理器运行时我无法让预处理器评估START和END 。 我的问题是:这有可能吗? 不能选择在运行时检查arrays的大小。 预先感谢任何提示或想法!

在C中的新#define中使用先前定义的#define

在做某些事情时是否存在任何潜在的问题/危险 #define SAMPLERATE 32 // Sample rate in hertz #define ONE_MINUTE ( SAMPLERATE * 60 ) #define FIVE_MINUTES ( ONE_MINUTE * 5 ) 我的编译器不会发出任何错误或警告。 这非常好,因为我可以更改一个#define值(SAMPLERATE),并且所有其他值都设置为他们需要的值而没有其他更改。 我不完全确定这是最佳做法还是安全。

预处理器不执行sizeof()

#if sizeof(int) != 4 /* do something */ 在#if内部使用sizeof无法正常工作,为什么? #define size(x) sizeof(x)/sizeof(x[0]) /*works*/

如果缺少参数,则将宏扩展为不同的默认宏

如果第一个参数不是预期值,是否可以扩展一个接受多个参数的宏到另一个宏 例如 int main() { PRINT(2, “%d%d\n”, i, j); //should expand to syslog(2, “%d%d\n”, i, j) PRINT(“%d%d\n”, i, j); //arg1 which is expected to be an int is not preset. /* This should expand differently may be to a default level say 3. syslog(3, “%d%d\n”, i,j); */ } 如果我知道args的总数,我会尝试过这种过载。

指向#define的指针

我只是想知道是否有可能指向#define常量的指针。 如果是的话,该怎么做?

C macro:将数字转换为字符串

我有一个表格,用于在5×7点显示屏上定义符号外观。 就像是: extern UINT8 symbols[][5] = { {0x0,0x0,0x0,0x0,0x0}, {0x0,0x0,0x5F,0x0,0x0}, {0x0,0x7,0x0,0x7,0x0}, {0x14,0x7F,0x14,0x7F,0x14}, // etc. 该表的前导部分与ASCII表匹配,后跟一组特殊符号,例如箭头或复选标记。 要引用那些我有一个宏列表: #define SYMBOL_LEFT_ARROW 120 // 120 is the entry in the table #define SYMBOL_RIGHT_ARROW (SYMBOL_LEFT_ARROW+1) #define SYMBOL_UP_ARROW (SYMBOL_RIGHT_ARROW+1) 现在我需要说一些(不会编译): const char * const message = “Next” + SYMBOL_RIGHT_ARROW; 问题:如何将SYMBOL_RIGHT_ARROW转换为“\ x79”,或将整个字符串转换为”Next\x79″ AT COMPILE TIME,以便我可以在R / O部分中输入字符串? 飞思卡尔HC08 C编译器。

C预处理器插入的空格

假设我们给出了这个输入C代码: #define Y 20 #define A(x) (10+x+Y) A(A(40)) gcc -E输出就像那样(10+(10+40 +20)+20) 。 gcc -E -traditional-cpp输出(10+(10+40+20)+20) 。 为什么默认cpp在40之后插入空格? 我在哪里可以找到涵盖该逻辑的最详细的cpp规范?

如何validationC宏中的类型

我一直在考虑如何validationC宏中的类型,到目前为止,我提出的最佳方法是: #define ASSERT_PTYPE(TYPE, VALUE) (0 && (*(int (*)(TYPE*))0)(VALUE)) 这显然需要一个类型名称和指向该类型的指针。 也可以制作类似的ASSERT_TYPE宏。 这似乎与海湾合作委员会合作得很好。 它甚至在类型不匹配的情况下提供了非常有用的错误消息。 问题是我不能完全确定这是有效的C还是最好的方法。 据我所知,标准说你可以转换函数指针,但调用转换函数指针的结果是未定义的。 在这种情况下,不可能在运行时调用该函数。 这是否足够好或标准是否意味着你甚至无法编写无法调用的代码来调用强制转换函数?