gpt4 book ai didi

c++ - 在 C++ 中转义外部代码块

转载 作者:行者123 更新时间:2023-11-28 03:17:06 25 4
gpt4 key购买 nike

我目前正在研究一种像这样工作的玩具语言:可以将用这种语言编写的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com