1. 程式人生 > >線上C++編譯器介紹

線上C++編譯器介紹

網上有許多線上C++編譯器。你可以利用它們對你的程式碼針對各種C++編譯器進行相容性測試,而不需要購買和安裝這些編譯器。

下面的網址是最有名的兩個線上C++編譯網站:

許多線上判題系統也可以用來進行線上編譯:

你可能會好奇這些網站使用的編譯器的版本和編譯引數到底是什麼。有些網站會提供這些資訊,而有些則不會。那麼你就只能靠自己去發現這些“祕密”了。

工欲善其事,必先利其器。讓我們先看看一些從編譯器獲取資訊的小技巧。

1. 輸出巨集

在C++中, 字串常數不能作為模板引數。大多數編譯器會在錯誤資訊中同時輸出字串的內容。下面的程式碼展示了這一技巧。

template<const char *> class

A {};
#define F0(x) #x
#define F1(x) F0(x)
#define V1 F1(__GNUC__)
int main()
{
    A<V1> a1;
}

這裡,巨集F0和F1用於將整型轉換成字串。編譯器會輸出類似於"literal "3" is not a valid template argument because it is the address of an object with static linkage"的出錯資訊。裡面的"3"就是你想知道的巨集的內容。

2. 輸出常數

下面是一種輸出整型常量的方法:

template<int N>
class

A
{
private:
    A();
};
int main()
{
    A<sizeof(char)> a;
}

3. 輸出變數型別

有時候,你可能需要知道某些變數的實際型別,這時候你可以使用下面的程式碼:

struct Dummy {};
void Fun(const Dummy &);
int main()
{
    Fun(1+1U);
}

PS:如果你使用的是gcc,那麼它會輸出"not convert `2' to `const Dummy&'",所以你需要將Fun的宣告改成"template<typename T> void Fun(T);"(換句話說,在gcc中上面的程式碼也可以用於輸出常數的值)

4. 輸出包含路徑

如果要獲取STL標頭檔案的路徑,你可以使用:

#include <ext/hash_set>
using __gnu_cxx::hash_set;

int main()
{
    hash_set<> m;
}

PS:這裡也可以使用vector。

下面是利用上面介紹的技巧獲得的dinkumware網站的一些資料:

1. VC

版本 (_MSC_FULL_VER):
         VC8 140050727
         VC7.1 13103077
         VC7 13009466
         VC6 12008804

包含路徑:
         D:/cplt501_vc_source/include (with _CPPLIB_VER=501)

2. EDG

版本(__EDG_VERSION__):
         3.05 

編譯引數:
         edgcc --alt -D_WIN32 -D_M_IX86 --no_inlining --diag_suppress=1290 --long_long --wchar_t_keyword -D_C99 -ID:/cplt501_gen_source/include/c -ID:/cplt501_gen_source/include -IC:/PROGRA~1/MICROS~2.NET/VC7/include --exceptions --microsoft -c sourceFile.cpp

因為使用了VC相容模式進行編譯,所以編譯器可能會模擬VC的部分bug

3. GCC

版本:
         3.2.0

包含路徑:
         D:/cplt501_gen_source/include and D:/Mingw/include/c++/3.2/

可以看到這裡使用的GCC的版本已經相當陳舊了