2017-08-28 57 views
-1

我無意中分配.C [注爲大寫C]擴展在Ubuntu 16.04 LTS我的C源代碼,並用gedit程序打開它進入我的代碼。GCC不承認* .C源代碼作爲有效的C程序

gcc編譯器不能識別它作爲一個C程序源代碼,併產生錯誤時,它嘗試編譯。

和Ubuntu的文件管理器顯示爲CPP文件。

代碼

#include <stdlib.h> 

int main(){ 

    int * c = malloc(sizeof(int)); 
    free(c); 

    return 0; 
} 

GCC編譯命令,輸出:

$gcc test.C -o test 
test.C:8:18: error: invalid conversion from ‘void*’ to ‘int*’ [-fpermissive] 
    int * c = malloc(sizeof(int)); 

正如我們知道這是一個C++特定的錯誤,我想GCC,行爲像一個C++文件如this 中所述。

這是我的系統信息

Linux ee 4.8.0-36-generiC#36~16.04.1-Ubuntu SMP i686 i686 i686 GNU/Linux 

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 

gedit - Version 3.18.3 

我知道我們根本的malloc()的返回值轉換爲(int*),這顯然會工作。

我們知道malloc()返回類型爲void*看到linuxdie malloc()

而且這還不是真正的在C投malloc()類型why not cast return of malloc()

是是事實,只有小寫的擴展是有效的C源代碼.c在UBUNTU下,如果真的,他們爲什麼這樣做?

如果不是我怎麼能解決這個問題和編譯我的source.C與我的機器上的gcc。

編輯

由於MCG在回答說,我們可以強制gcc對待任何給定的文件作爲特定類型是告訴它-x標誌。

例如,如果我們有.F擴展或者甚至是源代碼,而無需對任何UBUNTU擴展一個C有效的源代碼,通過使用該命令將被正確編譯,

編譯C源與任何代碼擴展

gcc -x c src.f -o src // with .f or any others 
gcc -x c src -o src //without extension 
+0

你是怎麼運行GCC的? – user2357112

+0

''#include '(你可能會強制使用C++編譯器,通過使用大寫'C') – wildplasser

+11

您應該通過將其重命名爲小寫'.c'來解決它。大寫'.C'表示習慣上的C++源代碼。 – Ryan

回答

3

GCC識別.C(大寫字母)擴展爲C++文件。您需要將文件的擴展名更改爲.c(小寫字母)。此外,您正確地提到並引用了C++在malloc的情況下需要轉換的地方,因爲在c中存在從任何對象指針類型到void *的隱式轉換。

請參閱以下有關GCC文檔的文件擴展名(.C.c)的說明。有關各種文件擴展名的詳細說明,請參閱下面的GCC鏈接。

file.C

C++ source code which must be preprocessed. Note that in .cxx, the last two letters must both be literally x. Likewise, .C refers to a literal capital C.

file.c

C source code which must be preprocessed.

https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Overall-Options.html

此外,您可以給標誌-x c迫使GCC對待文件保存爲C,而不是C++。

+0

謝謝。請在鏈接中添加一些信息(您可以使用-x選項明確指定輸入語言)以及我對@MarkPlotnick的評論,我們甚至可以編譯一個沒有擴展名的擴展名或任何帶有gcc的擴展名,只需給它指定'-xc'選項。 – EsmaeelE

+0

,並且需要關於這個問題的一些信息。正如我在帖子的評論部分所說,如果我們給gcc一個沒有擴展名的文件,它會產生'f:file not recognized:文件格式不被識別 collect2:error:ld returned 1 exit status'。但在'* .C'文件中的後置問題中,gcc實際上表現得像一個cpp源代碼。 gcc編譯器中是否有任何標誌使用並顯示此錯誤行爲? – EsmaeelE