使用预处理器更改语言语法

时间:2011-09-05 18:22:49

标签: c++ c-preprocessor

我读到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;
}

所以,是的,很明显你可以使用预处理器更改名称,但是如何使用预处理器将一种语言的功能实现为另一种语言呢?

我不打算通过这个来制作我自己的语言。我很好奇,看看它是如何运作的。

2 个答案:

答案 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替换。

此技术可用于以几乎任何语言集成文本宏(风险自负)。