如何对数字和字符串使用C宏?
我有一些类似上面的代码。我想把它简化成这样如何对数字和字符串使用C宏?,c,macros,c-preprocessor,C,Macros,C Preprocessor,我有一些类似上面的代码。我想把它简化成这样 if (termAttributes.c_lflag & OPOST) puts("c_lflag = OPOST"); if (termAttributes.c_lflag & OLCUC) puts("c_lflag = OLCUC"); 有人能演示如何定义TCFLAGPRINT吗?这里有一种方法: TCFLAGPRINT(termAttributes
if (termAttributes.c_lflag & OPOST)
puts("c_lflag = OPOST");
if (termAttributes.c_lflag & OLCUC)
puts("c_lflag = OLCUC");
有人能演示如何定义TCFLAGPRINT吗?这里有一种方法:
TCFLAGPRINT(termAttributes, c_lflag, OPOST)
TCFLAGPRINT(termAttributes, c_lflag, OLCUC)
do{
}while(0)
包装器是一种常见的习惯用法,它迫使您在宏调用的末尾添加分号。(在这种情况下,它还阻止您在宏调用后添加else
。)
函数类宏的替换文本中宏参数名称前面的#
运算符将参数名称转换为字符串文字
#字段“=”#标志
将三个字符串文字连接成一个字符串常量。我经常打印位掩码,因此我想出了自己的机制
我使用一个struct
表和一些函数
我从库中提取了一些代码来说明:
#define TCFLAGPRINT(tio, field, flag) \
do { \
if ((tio).field & (flag)) \
puts(#field " = " #flag); \
} while (0)
具体是什么问题?也许把宏名转换成字符串形式?
#include <stdio.h>
#include <string.h>
#include <termios.h>
typedef struct {
unsigned long tgb_val;
const char *tgb_tag;
const char *tgb_reason;
} tgb_t;
#define TGBEOT \
{ .tgb_tag = NULL }
#define TGBMORE(_tgb) \
_tgb->tgb_tag != NULL
#define _TGBFORALL(_tgb) \
; TGBMORE(_tgb); ++_tgb
#define TGBFORALL(_tga,_tgb) \
_tgb = _tga; TGBMORE(_tgb); ++_tgb
#define TGBDUAL(_sym) \
{ .tgb_val = _sym, .tgb_tag = #_sym },
tgb_t lflag_tgb[] = {
TGBDUAL(OPOST)
TGBDUAL(OLCUC)
TGBEOT
};
// tgbmskdcd -- decode mask value
char *
tgbmskdcd(char *buf,const tgb_t *tgb,unsigned long val)
{
const char *tag;
int sep;
char *bp;
int len;
bp = buf;
*bp = 0;
sep = 0;
for (TGBFORALL(tgb,tgb)) {
if ((val & tgb->tgb_val) == 0)
continue;
if (sep)
*bp++ = ' ';
sep = 1;
tag = tgb->tgb_tag;
len = strlen(tag);
strcpy(bp,tag);
bp += len;
}
return buf;
}
int
main(void)
{
struct termios term;
char buf[100];
tcgetattr(1,&term);
printf("c_lflag: %s\n",tgbmskdcd(buf,lflag_tgb,term.c_lflag));
return 0;
}
c_lflag: OPOST OLCUC