首页 > 解决方案 > 我们可以用 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标记,甚至没有宏?

标签: cmacros

解决方案


如 C 2018 5.1.1.2 1 中所述,C 的翻译分 8 个阶段进行,此处简化:

  1. 源文件中的字符以实现定义的方式映射到源字符集。
  2. 在反斜杠标记连续行的地方,这些行被连接在一起。
  3. 源文件分为预处理标记和空白序列。
  4. 执行预处理指令。
  5. 字符常量和字符串文字中的字符从源字符集转换为执行字符集。
  6. 相邻的字符串文字被连接起来。
  7. 预处理标记被转换为标记并在语法和语义上进行分析。
  8. 解析外部对象和函数引用。

您遇到的问题主要在于第 3 阶段。宏替换不适用于文本或字符。它替换了预处理标记,而不是字符。所以你不能用引号替换“some_korean”。即使“some_korean”被识别为预处理标记,引号也不是,因此它不能是宏替换数据中的预处理标记。

此外,“some_korean”可能意味着什么字符串可能是有问题的。要用作宏名称,它必须是语法中的标识符。标识符是一个标识符非数字字符,后跟任意数量的标识符非数字字符或数字字符(“0”到“9”)。标识符非数字是非数字(下划线、“a”到“z”或“A”到“Z”)、通用字符名称(在 C 标准的附录 D 中进一步详细说明)或任何实现 -为此目的定义的字符。

韩文字符似乎包含在附件 D 中列出的通用字符名称值中,因此在标识符中使用它们应该没问题,除非您使用列出的值之外的一些异常字符。但是,每个宏的替换文本必须包含适当的预处理器标记,包括整个字符串和字符常量,但不包括单个引号字符。


推荐阅读