我通过使用宏将函数名称,数字等替换为韩文,使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标记?
答案 0 :(得分:1)
按照C 2018 5.1.1.2 1的规定,C的翻译分为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预处理程序适用于令牌,而不适用于文本。令牌是完整的单词,例如int
或some_variable
,或者是运算符或标点符号,例如;
或+=
等。字符串文字"hello world"
是单个令牌。在替换预处理器之前,消除了注释。
类似#define some_korean "
之类的语法错误,因为宏的替换文本不是令牌序列。即使some_korean
实际上是some_korean
而不是朝鲜语字符也是如此。问题出在替换文本,而不是宏名称。 C不能那样工作。
(在K&R C中,预处理器在文本级别工作。因此,某些K&R C编译器可能能够以您想要的方式处理"
作为宏替换。但是这些编译器可能没有“完全不支持朝鲜语字符。K&R C于1989年被取代,并在2000年代初几乎完全消失。)
答案 2 :(得分:-1)