我们可以用c替换其他字符的引号吗?

时间:2019-06-10 10:01:58

标签: c macros

我通过使用宏将函数名称,数字等替换为韩文,使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标记?

3 个答案:

答案 0 :(得分:1)

按照C 2018 5.1.1.2 1的规定,C的翻译分为8个阶段,此处简化:

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

您遇到的问题主要在于第3阶段。宏替换无法在文本或字符的基础上进行;它代替了预处理标记,而不是字符。因此,您不能用引号代替“ some_korean”。即使“ some_korean”被识别为预处理标记,引号也不会被识别,因此它不能成为宏替换数据中的预处理标记。

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

在附件D中列出的通用字符名称值中似乎包含了

韩国字符,因此,除非在列表值之外使用了一些异常字符,否则在标识符中使用它们应该没问题。但是,每个宏的替换文本必须由适当的预处理器令牌组成,该令牌包括完整的字符串和字符常量,但不包括单个引号字符。

答案 1 :(得分:0)

不,您不能。 C预处理程序适用于令牌,而不适用于文本。令牌是完整的单词,例如intsome_variable,或者是运算符或标点符号,例如;+=等。字符串文字"hello world"是单个令牌。在替换预处理器之前,消除了注释。

类似#define some_korean "之类的语法错误,因为宏的替换文本不是令牌序列。即使some_korean实际上是some_korean而不是朝鲜语字符也是如此。问题出在替换文本,而不是宏名称。 C不能那样工作。

(在K&R C中,预处理器在文本级别工作。因此,某些K&R C编译器可能能够以您想要的方式处理"作为宏替换。但是这些编译器可能没有“完全不支持朝鲜语字符。K&R C于1989年被取代,并在2000年代初几乎完全消失。)

答案 2 :(得分:-1)

很少有编译器允许将Unicode字符用作标识符。据我所知,只有clang支持它,没有任何问题。

https://godbolt.org/z/1SCv3c

因此,请坚持使用ASCII。