使用预处理器更改语言语法
Using Preprocessors to change language Syntax
我读到Objective-C是通过使用预处理器指令来添加Smalltalk的特性到C,这让我有点好奇,所以我开始在c++中修补预处理器,只是因为我很无聊,想出了这个:
#include <iostream>
#include <string>
#define Constant const
#define Integer int
#define Real double
#define Boolean bool
#define Character char
#define String string;
#define System system
#define StandardLibrary std
#define OutputStream cout
int main()
{
Integer i = 1;
Integer ii = 2;
Integer iii = ii + i;
StandardLibrary::OutputStream<<iii;
System("pause");
return 0;
}
是的,很明显你可以用预处理器改变名字,但是怎么可能用预处理器把一种语言的特性实现到另一种语言呢?
我不打算通过这个创造自己的语言。我只是好奇它是如何工作的
像Objective C这样的语言可以使用预处理器来实现,但不能使用C预处理器,因为C预处理器语言是相当有限的,即使它是图灵完整的(它可能不是),它充其量是一个非常讨厌的图灵目标。更强大的预处理器将允许对语法进行更重要的更改。
一般来说,预处理器是这样一种程序,它接受一个源文件,并根据某些规则将文本转换为另一组源代码,然后将其编译为例如C代码。
这个想法是在运行下一个编译步骤之前,在源代码上运行C预处理器(gcc -E),它可以针对任何语言(或任何文本文件)运行。然后,所有的#define等将在它们到达实际的编译器之前被翻译。因此,在c#中,例如,您可以这样做:
// illegal C#, but valid for C preprocessor
#define INT_TYPE Int32
namespace Test
{
class Program
{
static void Main(string[] args)
{
INT_TYPE x = 42;
Console.WriteLine(x);
}
}
}
然后,使用C预处理器(gcc -E)预处理代码,然后使用c#编译器成功编译结果。在预处理阶段之后,INT_TYPE声明将被Int32取代。
这种技术对于在几乎任何语言中集成文本宏都很有用(风险由您自己承担)。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 不同语言中相同代码的不同行为
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- r语言 - C++ 类型为"const std ::?
- 通用C++/Python 多语言的存在
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 是否有用于C++的类似 C 的语法脚本语言解释器?
- 我如何将此C语言语法转换为C
- 如何为类C语言创建Visual Studio语法高亮
- c语言中的远函数指针是什么,它的语法是什么
- 使用预处理器更改语言语法
- 解析c++的语法结构是否比其他语言更难?