2011-09-05 87 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替換。

這種技術是在幾乎任何語言的文本整合的宏(風險自擔)是有用的。