c - 我们可以用 c 替换其他字符的引号吗?
问题描述
通过使用宏将函数名称、数字等替换为韩语,我制作了一个有点烦人的 C 头文件。像这样
#pragma once
#include <stdio.h>
#define 인트 int
#define 롱 long
#define 영 0
//and more and more
我想对引号做同样的事情,但是没有用。我的代码是
#define some_korean "
当我使用此代码编译程序时,出现错误 C2001
https://docs.microsoft.com/cpp/error-messages/compiler-errors-1/compiler-error-c2001?f1url=https%3A%2F%2Fmsdn .microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DKO-KR%26k%3Dk(C2001)%26rd%3Dtrue&view=vs-2019
有没有办法使用宏替换C中的qoute标记,甚至没有宏?
解决方案
如 C 2018 5.1.1.2 1 中所述,C 的翻译分 8 个阶段进行,此处简化:
- 源文件中的字符以实现定义的方式映射到源字符集。
- 在反斜杠标记连续行的地方,这些行被连接在一起。
- 源文件分为预处理标记和空白序列。
- 执行预处理指令。
- 字符常量和字符串文字中的字符从源字符集转换为执行字符集。
- 相邻的字符串文字被连接起来。
- 预处理标记被转换为标记并在语法和语义上进行分析。
- 解析外部对象和函数引用。
您遇到的问题主要在于第 3 阶段。宏替换不适用于文本或字符。它替换了预处理标记,而不是字符。所以你不能用引号替换“some_korean”。即使“some_korean”被识别为预处理标记,引号也不是,因此它不能是宏替换数据中的预处理标记。
此外,“some_korean”可能意味着什么字符串可能是有问题的。要用作宏名称,它必须是语法中的标识符。标识符是一个标识符非数字字符,后跟任意数量的标识符非数字字符或数字字符(“0”到“9”)。标识符非数字是非数字(下划线、“a”到“z”或“A”到“Z”)、通用字符名称(在 C 标准的附录 D 中进一步详细说明)或任何实现 -为此目的定义的字符。
韩文字符似乎包含在附件 D 中列出的通用字符名称值中,因此在标识符中使用它们应该没问题,除非您使用列出的值之外的一些异常字符。但是,每个宏的替换文本必须包含适当的预处理器标记,包括整个字符串和字符常量,但不包括单个引号字符。
推荐阅读
- c# - 尝试使用 MVVM 将对象添加到列表
- amazon-s3 - Minio 还是 S3 简单的网络浏览器?
- python - 无法将数据从引导表单保存到 Django 中的数据库
- oracle - oracle 工资单中按国家/地区的个人付款方式的银行详细信息
- firebase - 我可以在 firebase 文档字段中添加多个详细信息吗?
- ansible - 如何使用 Ansible consul_kv 向 Consul 添加新的键值对?
- android - Android Google Maps 卫星类型未加载
- mysql - MYSQL 存储过程未按预期运行
- r - 使用 rollRegres 中的 roll_regres 时出错:“宽度”上的断言失败
- elasticsearch - ElasticSearch - 按文档列值提升