c - 如何连接、评估和字符串化宏?
问题描述
我正在尝试对宏连接的替换(评估)进行字符串化。例如:
#include <stdio.h>
#define FOO_ONE 12
#define FOO_TWO 34
#define BAR_ONE 56
#define BAR_TWO 78
#define MAKE_MAC(mac) // ... what to do here?
void main(int argc, char *argv[])
{
printf("FOO: " MAKE_MAC(FOO) "\n");
printf("BAR: " MAKE_MAC(BAR) "\n");
}
我正在寻求的结果是:
FOO: 1234
BAR: 5678
我尝试了几种形式,我认为最好的尝试是这样的:
#define STRINGIFY(mac) #mac
#define CONCAT(mac1, mac2) STRINGIFY(mac1 ## mac2)
#define MAKE_MAC(mac) CONCAT(mac, _ONE) CONCAT(mac, _TWO)
但是,它只能让我走到这一步:
FOO: FOO_ONEFOO_TWO
BAR: BAR_ONEBAR_TWO
那么,如何在结果连接宏被字符串化之前添加额外的评估步骤?
解决方案
试试这个:
#include <stdio.h>
#define FOO_ONE 12
#define FOO_TWO 34
#define BAR_ONE 56
#define BAR_TWO 78
#define STRINGIFY(arg) #arg
#define CONCAT(arg1, arg2) STRINGIFY(arg1) STRINGIFY(arg2)
#define MAC(arg) CONCAT(arg##_ONE, arg##_TWO)
int main(){
printf("FOO: " MAC(FOO) "\n");
printf("BAR: " MAC(BAR) "\n");
return 0;
}
我的输出:
FOO: 1234
BAR: 5678
推荐阅读
- mysql - JSON 提取和转换为 MySQL 类型
- javascript - 匹配除字符串列表之外的所有内容的正则表达式
- visual-c++ - 检测输入键 C++
- etl - Informatica 过滤器基于不同数据库中另一个表上的日期列?
- javascript - 在 Angular 中从 pom.xml 读取 POM 版本
- windows - Docker 运行总是冻结或 WSL Ubuntu 发行版在等待生命周期服务器时停止
- python - 如何将嵌套字典中的值添加到玩家的统计数据中?
- angular - IONIC 4 FILE PLUGIN:resolveLocalFilesystemUrl 解析但将每个值作为“入口对象”的“UNDEFIED”
- java - Vertx 将 csv 文件/数据流式传输到 http 响应
- x86 - clang 不使用英特尔汇编语法