我目前正在研究一种像这样工作的玩具语言:可以将用这种语言编写的 block 嵌入到 C++ 源代码中,并且在编译之前,这些 block 在额外的预处理步骤中被翻译成 C++,生成有效的 C++来源。
我想确保这些 block 始终可以在源代码中明确标识,而且,只要源代码中存在这样的 block ,它就不可能是有效的 C++。此外,我想通过对嵌入式语言施加尽可能少的约束来实现这些(语言本身仍然有些流动)。
显而易见的方法是引入一对特殊的多字符括号,由不能在有效 C++ 代码(或嵌入式语言)中同时出现的字符组成。但是,我不确定如何确保特定的字符序列适合此目的(不是在 GotW #78 之后,无论如何 (:))。
那么逃避这些障碍的好方法是什么?
最佳答案
如果你的编译器可以接受C++11标准,您可以使用原始字符串文字,例如:
std::cout << R"*(<!DOCTYPE html>
<html>
<head>
<title>Title with a backslash \ here
and double " quote</title>)*";
因此,对于原始字符串文字,在这些原始字符串文字中没有禁止的字符序列。任何字符序列都可以出现在其中(但您可以定义原始字符串的结束序列)
你可以像我在 MELT macro-strings 中那样使用 #{
和 }#
; MELT是 Lisp 式的 domain specific language扩展 GCC,您可以在其中嵌入代码,例如
(code_chunk hellocount_chk
#{ /* $HELLOCOUNT_CHK chunk */
static int $HELLOCOUNT_CHK#_counter;
$HELLOCOUNT_CHK#_counter++;
$HELLOCOUNT_CHK#_lab:
printf ("Hello World, counted %d\n",
$HELLOCOUNT_CHK#_counter);
if (random() % 4 == 0) goto $HELLOCOUNT_CHK#_lab;
}#)
#{
和 }#
包含宏字符串(这些字符序列不太可能出现在 C 或 C++ 代码中,除了字符串文字和注释中),在此类宏字符串中使用 $
起始符号(最多为非字母或 #
字符)。
使用 #{
和 }#
并非万无一失(例如,因为原始字符串文字)但足够好:合作用户可以设法避免他们。
关于c++ - 在 C++ 中转义外部代码块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16507056/