怎麼判斷編譯器
『壹』 如何判斷一個程序是C編譯的還是C++編譯的
一般情況來說,c語言代碼是可以用C++編譯器編譯的,但是C編譯器,就一般不能編譯C++代碼。
自己區分的話:
1、包含頭文件格式:
#include
和有using
namespace的,都應該屬於C++的內容。
而#include也應該是C++,因為它屬於C++的庫,由於C++代碼可以應用C語言的函數庫,所以比較難區分。
比如#include的,不一定就是C語言代碼
『貳』 怎樣辨別是用C編譯的代碼,還是C++編譯的代碼
首先:要看你的編譯環境,有的編譯環境是區分C/C++的,而像VC++這樣的,就不區分,兼容。
一般情況來說,C語言代碼是可以用C++編譯器編譯的,但是C編譯器,就一般不能編譯C++代碼。
自己區分的話:
1、包含頭文件格式:
#include<iostream>
和有using
namespace的,都應該屬於C++的內容。
而#include<iostream.h>也應該是C++,因為它屬於C++的庫,由於C++代碼可以應用C語言的函數庫,所以比較難區分。
比如#include<stdio.h>的,不一定就是C語言代碼。
2、出現class定義的類的,無疑是C++代碼。
3、應用到STL,模板等特性的,也應該算是C++代碼。
不應該強行區分,因為本來C++就是對C的擴展,如果強制用C語言編寫程序,則可以再看一些C語言的書,重點看出兩者的不同。
『叄』 在C/C++程序中,怎樣可以知道編譯器是GCC或G++
如果是gcc在預編譯的時候會有一個名叫__GLIBC__的宏,如果是g++會有一個叫做__GLIBCXX__的宏,如果想知道版本可以用宏
#ifdef __GLIBC__
int main () //gcc
#elif __GLIBCXX__
int main() //g++
另外,gcc和g++都不完全算是純編譯器,兩個只有連接器的區別,編譯的方式是基本一樣的
『肆』 怎樣判斷c語言編譯器好壞
for語句的判斷句是在前的,也就是先進行判斷,結果是真才執行循環體,這是for語句的模式。如果你希望判斷在後的話可以用do-while語句.
『伍』 如何判斷一段程序是由C 編譯程序還是由C++編譯程序編譯的
以下是在論壇中看到的兩種解釋: (1)如果是要你的代碼在編譯時發現編譯器類型,就判斷_cplusplus或_STDC_宏,通常許多編譯器還有其他編譯標志宏, #ifdef __cplusplus cout<<"c++";#else cout<<"c";#endif如果要判斷已經編譯的代碼的編譯類型,就用nm查一下輸出函數符號是否和函數名相同。(相同為c,不同為c++。詳解見下面)(2)簡單是說,由於c語言是沒有重載函數的概念的,所以c編譯器編譯的程序里,所有函數只有函數名對應的入口。而由於c++語言有重載函數 的概念,如果只有函數名對應的入口,則會出現混淆,所以c++編譯器編譯的程序,應該是函數名+參數類型列表對應到入口。 注意,因為mian函數是整個程序的入口,所以mian是不能有重載的,所以,如果一個程序只有main函數,是無法確認是c還是c++編譯器編譯的可以通過nm來查看函數名入口如一個函數int foo(int i, float j) c編譯的程序通過nm查看 foo 0x567xxxxxx (地址) c++編譯程序,通過nm查看 foo(int, float) 0x567xxxxxx 另外,如果要在c++編譯器里使用通過c編譯的目標文件,必須通知c++編譯器,我使用的函數是c風格的,不需要列出參數列表的,這樣c++編譯才能正確的連接
『陸』 如何在C語言中用宏來判斷當前編譯器
1、_MSC_VER 是微軟C/C++編譯器——cl.exe 編譯代碼時預定義的一個宏。需
要針對cl 編寫代碼時, 可以使用該宏進行條件編譯。
2、_MSC_VER 的值表示cl 的版本。需要針對cl 特定版本編寫代碼時, 也可以使用
該宏進行條件編譯。
3、_MSC_VER 的類型是"int",具體版本號定義如下:
MS VC++ 9.0 _MSC_VER = 1500
MS VC++ 8.0 _MSC_VER = 1400
MS VC++ 7.1 _MSC_VER = 1310
MS VC++ 7.0 _MSC_VER = 1300
MS VC++ 6.0 _MSC_VER = 1200
MS VC++ 5.0 _MSC_VER = 1100
其中MS VC++ 9.0 就是Visual C++ 2008,MS VC++ 8.0 就是Visual C++2005。
二、介紹預定義宏「__GNUC__」
1、__GNUC__ 是gcc 編譯器編譯代碼時預定義的一個宏。需要針對gcc 編寫代碼時,
可以使用該宏進行條件編譯。
2、__GNUC__ 的值表示gcc 的版本。需要針對gcc 特定版本編寫代碼時,也可以使
用該宏進行條件編譯。
3、__GNUC__ 的類型是「int」
三、預定義宏"__MINGW32__"
1、MinGW編譯器
四、symbian sdk 預定義宏:
symbian 平台,定義"__SYMBIAN32_"
3rd MR 版及之前的那個3rd 版本,定義"__SERIES60_30__"
3rd FP1 版,定義"__SERIES60_31__"
3rd FP2 版,定義"__SERIES60_32__"
另外,還有一個"__SERIES60_3x__"。若不需區分具體是哪一個3rd 版,則用之。
『柒』 如何確定VS編譯器版本
如何確定VS編譯器版本
_MSC_VER是MSVC編譯器的內置宏,定義了編譯器的版本,_MSC_VER 值對應版本關系
MSVC++ 11.0 _MSC_VER = 1700 (Visual Studio 2012)
MSVC++ 10.0 _MSC_VER = 1600 (Visual Studio 2010)
MSVC++ 9.0 _MSC_VER = 1500 (Visual Studio 2008)
MSVC++ 8.0 _MSC_VER = 1400 (Visual Studio 2005)
MSVC++ 7.1 _MSC_VER = 1310 (Visual Studio 2003)
MSVC++ 7.0 _MSC_VER = 1300 (Visual Studio 2002)
MSVC++ 6.0 _MSC_VER = 1200
MSVC++ 5.0 _MSC_VER = 1100
example:
#if (_MSC_VER == 1300) //vc7
#import "acax16ENU.tlb" no_implementation raw_interfaces_only named_guids
#elif (_MSC_VER == 1200) //vc6
#import "acad.tlb" no_implementation raw_interfaces_only named_guids
#elif (_MSC_VER == 1400) //vc8
#import "acax17ENU.tlb" no_implementation raw_interfaces_only named_guids
#elif (_MSC_VER == 1500) //vc9
#import "acax18ENU.tlb" no_implementation raw_interfaces_only named_guids
#endif
在程序中加入_MSC_VER宏可以根據編譯器版本讓編譯器選擇性地編譯一段程序。例如一個版本編譯器產生的lib文件可能不能被另一個版
本的編譯器調用,那麼在開發應用程序的時候,在該程序的lib調用庫中放入多個版本編譯器產生的lib文件。在程序中加入_MSC_VER宏
,編譯器就能夠在調用的時根據其版本自動選擇可以鏈接的lib庫版本,如下所示。
#if _MSC_VER >= 1400 // for vc8, or vc9
#ifdef _DEBUG
#pragma comment( lib, "SomeLib-vc8-d.lib" )
#else if
#pragma comment( lib, "SomeLib-vc8-r.lib" )
#endif
#else if _MSC_VER >= 1310 // for vc71
#ifdef _DEBUG
#pragma comment( lib, "SomeLib-vc71-d.lib" )
#else if
#pragma comment( lib, "SomeLib-vc71-r.lib" )
#endif
#else if _MSC_VER >=1200 // for vc6
#ifdef _DEBUG
#pragma comment( lib, "SomeLib-vc6-d.lib" )
#else if
#pragma comment( lib, "SomeLib-vc6-r.lib" )
#endif
#endif
『捌』 怎麼看編譯器用的是哪個c++版本
請運行以下代碼以檢查版本。
#include<iostream>
int main() {
if (__cplusplus == 201703L) std::cout << "C++17\n";
else if (__cplusplus == 201402L) std::cout << "C++14\n";
else if (__cplusplus == 201103L) std::cout << "C++11\n";
else if (__cplusplus == 199711L) std::cout << "C++98\n";
else std::cout << "pre-standard C++\n";
}
『玖』 如何判斷編譯器所編譯的文件是C方式還是C++的方式編譯的
沒有辦法區分。C++是兼容C的,所以在C++代碼中出現一兩句C的語句也很正常,比如printf之類。(有時候printf確實比cout好用,但是scanf不如cin是一定的)所以只能根據後綴區分吧。
『拾』 關於如何判斷gcc之類的編譯器的編譯結果
我們再使用gcc編譯的時候可以讓他的輸出信息保存到文件當中
gccmain.c-omain&>status.txt
上面的命令就是將gcc編譯的信息保存到status.txt文件中,然後我們再程序中讀取文件,看文件是否有內容,沒有內容就說明沒有報錯和警告,編譯成功。有內容就對每一行內容進行判斷,看是warring還是error,只有warring也代表編譯成功,有error代表編譯失敗,然後把這些報錯信息都列印出來就好了。
下面看一下例子: