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

程式設計好習慣:拒絕魔數,善用常數與巨集

     編輯:關於C語言

魔數 指在程式碼中直接使用字面數值(如 64),而非透過巨集(#define)或常數(const)賦予語義名稱。這看似微不足道,實則是維護噩夢的溫床。

反面範例:充滿魔數的 adjustMsk()

#define MIN_MSK_LEN 20

int adjustMsk(MskContext *Context)
{
    char temp[64] = {0};                    // 魔數 64:MSK 最大位元組數

    if (Context->lenMsk > 64) {             // 魔數 64 再次出現
        memcpy(temp, Context->msk + (Context->lenMsk - 64), 64); // 第三次
        // ...
        memcpy(Context->msk, temp, 64);     // 第四次
    }
    else if (Context->lenMsk < MIN_MSK_LEN) // 唯一使用常數的地方
        return ERROR;
    // ...
}

魔數的三大禍害

  1. 可讀性極低:見到 64 無法立即理解其業務含義;註解易過時、不同步,不如常數名稱直觀。
  2. 修改風險高:若上限從 64 改為 128,必須逐一檢視並修改每一處 64,極易漏改或誤改。
  3. 跨模組共享困難:其他模組需用同一上限時,無法引用統一定義,導致定義分散、不一致。

最佳實踐:引入語義常數

#define MIN_MSK_LEN 20
#define MAX_MSK_LEN 64          // 語義化命名

int adjustMsk(MskContext *Context)
{
    char temp[MAX_MSK_LEN] = {0};

    if (Context->lenMsk > MAX_MSK_LEN) {
        memcpy(temp, Context->msk + (Context->lenMsk - MAX_MSK_LEN), MAX_MSK_LEN);
        // ...
        memcpy(Context->msk, temp, MAX_MSK_LEN);
    }
    else if (Context->lenMsk < MIN_MSK_LEN)
        return ERROR;
    // ...
}

進階建議

  • C++ 偏好 constexpr 或 const:具型別安全、作用域限制、除錯可見性優於巨集。
  • 集中管理:將專案通用常數集中於 constants.h 或命名空間,便於維護與複用。
  • 命名規範:採用 MAX_/MIN_/DEFAULT_ 前綴,語義一目瞭然。

「魔數」之「魔」,非魔法之神奇,乃魔鬼般可怕。養成「見數值即定義常數」的習慣,是專業工程師的基本素養。

本文出自 “至簡李雲” 博客,請務必保留此出處:https://yunli.blog.51cto.com/831344/265730

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