首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言代碼能否在 C++ 編譯器下練習?相容性與陷阱全解析

     編輯:C 語言問答

結論:大多數合法 C90/C99 代碼可直接用 C++ 編譯器編譯,但存在關鍵差異導致行為不同或編譯失敗。

主要不相容點

類別C 合法但 C++ 非法/行為不同說明
隱式 void* 轉換`int *p = malloc(sizeof(int));`C++ 需顯式轉型 `(int*)malloc(...)` 或改用 `new int`
關鍵字差異`class`, `template`, `new`, `delete`, `namespace`, `bool`, `true`, `false` 作變數名C++ 保留字,C 可用作標識符
結構體標籤`struct S {int a;}; S s;`C++ 可直接用 `S s;`,C 需 `struct S s;` 或 `typedef struct S S;`
空參函式`void f();`C 表示參數未指定,C++ 等同 `void f(void)`
const 預設連結`const int x = 1;`C 外部連結,C++ 內部連結 (需 `extern const int x = 1;`)
字串字面值類型`char *s = "hello";`C++ 類型為 `const char[N]`,禁止修改,C 類型為 `char[N]` (但修改行為未定義)
VLA (變長陣列)`int n; scanf("%d",&n); int a[n];`C99 支援,C++ 標準不支援 (GCC/Clang 為擴展支援)
指定初始化器`struct {int x,y;} p = {.y=2};`C99 支援,C++20 才引入 (且語法略異)
`restrict` 關鍵字`void *memcpy(void *restrict s1, const void *restrict s2, size_t n);`C99 標準,C++ 無 (編譯器擴展 `__restrict`)
複數類型`_Complex double z = 1.0 + 2.0*I;`C99 ``,C++ 用 `` 模板

實務建議

  • 學 C 就用 C 編譯器 (GCC/Clang/MSVC `-std=c11`),學 C++ 就用 C++ 編譯器 (`-std=c++20`)。
  • 若必須在 C++ 專案中引用 C 代碼:
    → 將 C 代碼編譯為靜態/動態庫,頭檔用 `extern "C"` 包裹。
    → 或在 C++ 源檔中 `#include ` 等 C++ 版標頭,避免直接包含 C 標頭。
  • 考試/面試環境通常指定語言標準,嚴格區分。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved