因項目需要,將一個早期的gcc編譯運行正常的c工程修改爲g++,問題很多。
1 大量的類型不匹配
究其原因,g++是不允許不同類型指針互相賦值的,在出錯位置加入強制類型轉換即可。
2 部分變量was not declared in the scope
gcc下運行正常的代碼,g++編譯出錯,原因爲c++要求函數或變量在使用前必須要聲明,具體問題具體分析即可。
3 initializer-string for array of chars is too long
定義的字符數組長度過短,而初始化的數組過長引起。gcc對數組寬容度很高。
4 types may not defined in sizeof expressions
工程中有這樣的宏
#define kvec_t(type) struct { size_t n, m; type *a; }
使用時用sizeof(kvec_t(int)),在gcc下正常,g++報錯
查找問題,g++下sizeof中用struct的語法是不合法的,該問題的解決辦法是將struct重新定義成typedef的形式,siziof(struct_test)的形式。
5 uninitialized const
原因是工程中定義的全局常量數組未初始化 const unit8_t a[8]。
將其初始化即可。
6 出現部分函數 未定義的引用 undefined reference
程序中出現的問題包括:
(1)原工程使用extern c對部分函數進行修飾,g++編譯後這部分函數未被編譯成g++格式,導致鏈接不到。註釋掉這些extern c 問題解決;
(2)在函數體內部使用extern來聲明其他文件中的函數,g++雖然將兩者都編譯成g++格式,但函數名有差異,導致無法鏈接。
解決辦法:將函數在函數體外以正確的方式重新聲明。