2015年5月26日 星期二

[Error] Invalid conversion from 'int' to 'main(int, char**)::fruit_tea' [-fpermissive]


當你嘗試編譯將 int 數值指定給 enum 型態的變數時,會出現編譯錯誤訊息如下:
Invalid conversion from 'int' to 'main(int, char**)::fruit_tea' [-fpermissive]

範例程式如下:
#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) 
{
 enum fruit_tea { apple, banana, orange } taste;
 taste = 10;
 std::cout << taste << std::endl;
 return 0;
}

解決方法就是將 fpermissive flag 加入到編譯的選項中,下面的圖示是使用 OrWell Dev-C++ IDE,設定方法步驟:點選 project 右鍵 >> Project Options... >> Parameters 在 C++ compiler中填入 -fpermissive 即可。重新編譯程式時,原本錯誤的地方就變成是 Warning 了。


下面有關 fpermissive flag 的解釋擷取至 3.5 Options Controlling C++ Dialect 。主要是讓原本編譯器將某些不合適的 code 判斷為錯誤的訊息改成為警告訊息,以便讓程式可以編譯成功。

-fpermissive
Downgrade some diagnostics about nonconformant code from errors to warnings. Thus, using -fpermissive will allow some nonconforming code to compile. 

上面的例子,想要將整數值指定給列舉型態變數;因為指定的整數值未必在列舉型態的範圍內,所以C++ 禁止將 整數值指定給 列舉型態變數,但可以將列舉型態變數值指定給整數型態變數,因為列舉型態也是一種整數型態。

基本上不建議使用 fpermissive flag 來解此類的問題,如上面所說 整數值未必在 列舉型態的範圍中,允許指定整數值給列舉型態可能會造成不必要的麻煩。


[相關鏈結]

2015年5月21日 星期四

Error C4335: Mac file format detected: please convert the source file to either DOS or UNIX format

最近把一個 Third Party Lib include 到專案內;使用VS 2010 編譯時卻出現下列問題,在 Ubuntu下編譯卻不會這樣的問題發生。比較快的方式是將所有的 Third Party 的 Source code 修正成 Windows 或者 UNIX 的檔案格式。但這樣不是很理想,我們不應該修改 Third Party 的Source code 除非必要。這樣以後要 Upgrade 才不會遇到太多問題。
 
error C4335: Mac file format detected: please convert the source file to either DOS or UNIX format

要解決這個問題又不改到 Third Party Source Code 的方法就是直接把那個 C4335 關閉即可,下面是如何關閉的圖示:


  • 點選專案 > 右鍵 > 選擇 Properties
  • Configuration Properties > C/C++ > Advanced > Disable Specific Warnings 填入 4335 即可。