2011-09-05 51 views
4

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

有什么问题吗? –

+1

你做了什么改进,甚至有帮助?顺便说一句,你可以使用'typedef'或'using'来完成你所做的大部分事情。 –

+0

不是!我只想知道如何使用预处理器将一种语言的特性实现到另一种语言中。 –

回答

4

像Objective C这样的语言可以使用预处理器来实现,但不能用C预处理器来实现,因为C预处理器语言是相当有限的,如果它甚至是图灵完备的(它可能不是),它至多是一个非常讨厌的图灵坦率。更强大的预处理器将允许对语法进行更重要的更改。

在一般预处理器是一个程序,根据一定的规则进一些其它组源代码,然后将其编译成例如C代码需要一个源文件并执行文本的转换。

+2

c预处理器在严格意义上不是* ture完整的,因为你不能用它编写循环。您可以通过多次运行预处理器来解决此问题,如[本文](http://www.ioccc.org/2001/herrmann1.hint)中所述。 – ComicSansMS

+0

这种黑客肯定会把它深入到塔里的土地上。 – YSN

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),然后将代码编译的结果successfullly使用C#编译器。在预处理阶段后,INT_TYPE声明将被Int32替换。

这种技术是在几乎任何语言的文本整合的宏(风险自担)是有用的。