我读到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;
}
所以,是的,很明显你可以使用预处理器更改名称,但是如何使用预处理器将一种语言的功能实现为另一种语言呢?
我不打算通过这个来制作我自己的语言。我很好奇,看看它是如何运作的。
答案 0 :(得分:4)
像Objective C这样的语言可以使用预处理器来实现,但不能使用C预处理器来实现,因为C预处理器语言相当有限,如果它甚至是图灵完成(可能不是),它至多是一个非常讨厌的图灵焦油坑。更强大的预处理器将允许对语法进行更重要的更改。
一般来说,预处理程序是一个程序,它接受源文件并根据某些规则将文本转换为其他一组源代码,然后将其编译为例如C代码。
答案 1 :(得分:1)
这个想法是在运行下一个编译步骤之前运行C预处理器(gcc -E),它可以在源上针对任何语言(或任何文本文件)运行。然后,所有#defines等将在到达实际编译器之前进行翻译。因此,在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替换。
此技术可用于以几乎任何语言集成文本宏(风险自负)。