C與C++的相容性

C語言和C++的關係相當密切，但是也存在許多顯著的差異。C++標準起源於早期C標準， 並被設計為與當時的C語言在原始碼編寫和連結方面很大程度上相容。 因此，兩種語言的開發工具通常被整合到單個產品中，程式設計師可以自己選擇編寫的是C還是C++，開發工具通常會根據程式設計師的選擇使用不同的編譯器和連結器或不同的庫。但是，C並不是C++的子集， 一般的 C 程式碼不經修改很難被一些嚴格符合C++標準的C++編譯器成功編譯；同樣，C++ 引入了許多 C 中沒有的特性，所以，幾乎所有用 C++ 編寫的程式碼都無法被 C 編譯器成功編譯。在這篇文章中，我們主要討論的是它們在公共部分的差異，比如在C語言中合法的程式碼到了C++中成為了不合法的程式碼，或一段程式碼在C和C++中表現出不同的行為。C++的創始人Bjarne Stroustrup建議 C和C++應該儘可能減小差異，以最大限度地提高這兩種語言的相容性；而另一些人則認為C和C++畢竟是兩種不同的語言——雖然C++起源於C——因此它們之間的相容性並不是那麼重要。 而ANSI是這樣看的：「我們贊同保持C與C++的最大公共子集原則」，同時「保持它們的差別，使這兩種語言繼續獨立發展」，「……委員會希望C++成為重要的和強有力的語言。」截止到C++20和C2x，C++ 還是不支援部分C語言特性，如變長陣列，原生複數支援和codice_1。另一方面，與C89相比，C99透過合併C++功能減少了一些其他不相容性。在C中允許而在C++中不允許存在的程式碼語句.C++較C語言有更嚴格的型別轉換和初始化規則 ， 因此一些在C語言裡合法的語句在C++裡是不合法的。ISO C++附錄C.1中列出了這些區別。/*從void *到int *的隱式轉換*/int *i = ptr;或類似的：int *j = malloc(5 * sizeof *j); /*從void *到int *的隱式轉換 */為了使程式碼在C和C++中同時可用， 必須使用強制型別轉換， 如下所示：void *ptr;int *i = (int *)ptr;int *j = (int *)malloc(5 * sizeof *j);C++中提供了其它方法來實現指標型別轉換。C++不推薦繼續使用老式型別轉換。老式型別轉換在形式上來說不是特別清晰，容易被忽略。。void *ptr;auto i = reinterpret_cast(ptr);auto j = new int[5];const int var1;const int var2 = 1;第一行程式碼在C語言中是允許的，但在C++中會報錯；第二行程式碼在C和C++中都是合法的。void fn(void)goto flack;int i = 1;flack:enum BOOL {FALSE, TRUE};typedef int BOOL;//在C語言中允許，在C++中不允許struct foo{int bar;/*在C++中，以上形式被隱式轉換為：typedef struct foo{int bar;} foo;struct foo foobar;//在C與C++中均可foo foobar2; //在C語言中不允許，在C++中允許int add(a,b)int a;int b;return a+b;struct foo{struct bar{int x;int y;然而，在使用時，C和C++採用不同的方法，假設此時已有struct foo型別變數a， 且x = 1，y = 2；如要將x賦值給變數b，c：//以下是C語言方法,在C++中不允許：int b = a.x;//以下是C++特有方法，在C中不允許:int c = a::xvoid foo(size_t x, int a[*]); // 使用VLA的函式void foo(size_t x, int a[x])printf("%zu\n", sizeof a); // 等同於sizeof(int*)char s[x*2];printf("%zu\n", sizeof s); // 將顯示x*2struct Xint n, m;char bytes[];int foo(int a[const]); // 相當於int foo(int *const a);int bar(char s[static 5]); // 表示s的長度至少為5struct X a = (struct X){4, 6}; // 在C++ 中等於 X{4, 6}.struct X a = {.n = 4, .m = 6};char s[20] = {[0] = 'a', [8]='g'};struct templateint new;struct template* class;以上程式碼在C語言中是允許的，但是在C++中不允許。在C和C++中行為不同的語句.有一些語句在C和C++中都有效，但是在兩種語言中會產生不同的結果。/* Copyright (C) 1998-2020 Free Software Foundation, Inc.This file is part of GCC.GCC is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 3, or (at your option)any later version.GCC is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.Under Section 7 of GPL version 3, you are granted additionalpermissions described in the GCC Runtime Library Exception, version3.1, as published by the Free Software Foundation.You should have received a copy of the GNU General Public License anda copy of the GCC Runtime Library Exception along with this program;see the files COPYING3 and COPYING.RUNTIME respectively. If not, see* ISO C Standard: 7.16 Boolean type and values需要注意的是，codice_54在C語言中被儲存為int型別。extern int T;int size(void)struct T { int i; int j; };return sizeof(T);/* C: return sizeof(int)* C++: return sizeof(struct T)這是因為在C語言中，struct型別前需要新增“codice_17”，而在這個例子中，因為codice_60前沒有codice_17，所以它所代表的是在外部定義的int變數；而在C++中，因為可以省略codice_17，因此造成了歧義。然而，在C++中如果使用codice_63這種形式，編譯器會更傾向於認為T是一個表示式，因此編譯會出錯；而在C語言中則不會。