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

VS2012 C++ 遠指針關鍵字 far 編譯錯誤:typedef void far * 缺少 far 定義

     編輯:程式設計疑難解答

錯誤代碼

typedef void far * XMSDRIVER;
// 編譯錯誤: 在 * 處提示 "應輸入;" (Error C2143)

相關宏定義

#ifndef FAR
#ifdef NEED_FAR_POINTERS
#define FAR far
#else
#define FAR
#endif
#endif

錯誤原因深度分析

  1. 宏名稱大小寫不匹配:代碼使用 `far` (小寫),宏定義的是 `FAR` (大寫)。C/C++ 區分大小寫,`far` 未被定義。
  2. 編譯器視角:編譯器看到 `typedef void far`,以為 `far` 是給 `void` 起的別名 (如 `typedef void MyVoid;`)。
    • 隨後看到 `*`,語法上 `typedef void far *` 變成了 `typedef (void far) *`,即「聲明一個指向 `void far` 類型的指針」。
    • 但 `void far` 不是完整類型聲明,編譯器期望在 `far` 後跟分號結束類型定義,故報錯「應輸入;」。
  3. 歷史背景:`far` 是 16 位時代 (DOS/Windows 3.x) 的**非標準關鍵字**,用於聲明遠指針 (32 位:段:偏移)。現代 32/64 位編譯器 (VS2012+) **不再支持** `far` 關鍵字,通常定義為空宏消除。

解決方案

方案一:統一宏大小寫 (若必須保留 far 符號)

// 修正宏定義
#ifndef FAR
#define FAR far  // 或根據平台定義
#endif

// 代碼中使用大寫宏
typedef void FAR * XMSDRIVER; // 正確:展開為 typedef void far * XMSDRIVER;

方案二:現代編譯器直接移除 far (推薦)

// 現代 32/64 位平台指針默認即為「遠」 (平坦內存模型)
#define FAR  // 定義為空

typedef void FAR * XMSDRIVER; // 展開為 typedef void * XMSDRIVER;
// 等價於
typedef void * XMSDRIVER;

方案三:使用標準類型別名

#include 
// 若 XMSDRIVER 實際是通用指針
using XMSDRIVER = void*; 
// 或 uintptr_t 用於指針算術/存儲
using XMSDRIVER = uintptr_t;

驗證修正

// 測試代碼
#include 
#define FAR  // 現代編譯器定義為空

typedef void FAR * XMSDRIVER;

int main() {
    XMSDRIVER ptr = nullptr;
    std::cout << "XMSDRIVER size: " << sizeof(ptr) << " bytes\n"; // 64位輸出 8
    return 0;
}

總結

VS2012 編譯 `typedef void far *` 報錯「應輸入;」的根因是 `far` (小寫) 未被定義,導致編譯器誤解析語法。解決方法:宏名稱統一大寫 `FAR` 並在代碼中使用 `FAR`,或現代編譯器直接定義 `FAR` 為空移除遠指針關鍵字。16 位時代的 `far`/`near`/`huge` 在現代平台已無意義,應清理遺留代碼。

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