Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对数字和字符串使用C宏?_C_Macros_C Preprocessor - Fatal编程技术网

如何对数字和字符串使用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