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

C 語言編譯錯誤 C2059:巨集定義與變數名稱衝突導致語法錯誤

     編輯:程式設計疑難解答

錯誤現場

#define n 10
void main(void) {
    int a,b,c,n;  // 錯誤行
    // ...
}

編譯器報錯:error C2059: syntax error : 'constant'

根本原因:巨集展開導致語法非法

#define n 10 是全域文字替換,預處理階段會將後續所有 n 替換為 10。
原本宣告變數的語句 int a,b,c,n; 經預處理後變成:

int a,b,c,10;  // 語法錯誤:無法宣告常數 10 為變數

編譯器看到 int ... 10 當然報 syntax error。

修正方案

  1. 刪除或重命名變數:將區域變數 n 改名(如 num、count),避開巨集名稱。
    int a, b, c, num;
  2. 或取消巨集:若區域變數 n 才是需要的,移除 #define n 10,改用 const int N = 10;(有型別、有作用域、不汙染全域命名空間)。

最佳實踐:避免巨集與變數同名

  • 巨集命名慣例:全大寫 + 下劃線,如 MAX_SIZE、BUFFER_LEN。
  • 變數命名:小寫駝峰或下劃線,如 maxSize、buffer_len。
  • 優先使用 const / constexpr / enum 替代 #define 定義常數,享有型別檢查與作用域限制。

修正後代碼片段

#include <stdio.h>
#define MAX_N 10  // 巨集全大寫

void main(void) {
    int a, b, c, n;  // 區域變數小寫,無衝突
    int s[15] = {0};
    int l[MAX_N], i[MAX_N];
    int A[MAX_N-1][15];
    // ... 後續邏輯 ...
}

一行巨集定義,讓編譯器把變數宣告「吃」成常數,是 C/C++ 新手最常踩的坑之一。養成命名規範,善用 const,從源頭杜絕此類低級錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved