2014-03-30 51 views
-1

我有以下代碼:更改預處理器變量到運行時因變量

#include <stdio.h> 
#include <stdarg.h> 

#define A 10 
#define B 20 
#define C 30 

int m = A + B; 
const int n = A + B + C; 

void foo1(int x) { 
    m += A + B + x; 
} 

void foo2(int x = B, int y = C, ...) { 
    m += B + C + x; 
    if (m > n) foo1(y); 
    /* Some statements here */ 
} 
/* And MUCH MORE functions and some global variables like these here. */ 

int main() { 
    /* Some statements here */ 
    return 0; 
} 

我想這些ABC作爲運行時因變量,這將在main()功能處理(無#define)。在不改變大部分代碼的情況下,將預處理器變量變爲運行時相關變量的最佳方法是什麼? (假設整個代碼超過1000行)。

+1

您的默認參數符號無效C,但它是有效的在C++中。你學習哪種語言? –

+0

最簡單的方法是用全局變量替換它們。雖然這可能不是一個好主意。 –

+0

@JonathanLeffler好吧,我編輯了這個問題,因爲我不確定。順便說一句,我正在學習C. – arnobpl

回答

0

由於沒有人回答我的問題,我終於根據我的實際工作回答了它。雖然我不確定是否有更好的方法將預處理器變量更改爲運行時相關變量。

治癒的情況:

  • 首先,取消代碼必要 「的#define」 語句。這將在與預處理器變量相關的變量中突出顯示錯誤(例如,通過Visual Studio Intellisense)。
  • 然後在main函數(或其他函數)中移動突出顯示的變量賦值。您不需要將函數內部的變量移動到所有函數之外(即全局變量)。如果可能的話,使用Find-and-Replace,Regex,宏任務自動化。
  • 然後在全局聲明預處理器變量名稱。我想,常量變量將會消失,但沒有選擇。
  • 最後,檢查代碼中的錯誤,並在必要時進行調試。

的防治情況:

預防勝於治療。應該保持精心策劃的項目。如果運行時相關變量的可能性很高,請不要使用預處理器語句。這個問題的代碼

定稿代碼:

#include <stdio.h> 
#include <stdarg.h> 

/* Preprocessor variable names as global variables */ 
int A, B, C; 

/* Assignments are moved */ 
int m; 
int n; /* no more constant */ 

void foo1(int x) { 
    m += A + B + x; 
} 

void foo2(int x = B, int y = C, ...) { 
    m += B + C + x; 
    if (m > n) foo1(y); 
    /* Some statements here */ 
} 
/* And MUCH MORE functions and some global variables like these here. */ 

int main() { 
    /* 
    A, B, C actually runtime dependant. 
    But for simplicity, they are hardcoded here. 
    */ 
    A = 10; 
    B = 20; 
    C = 30; 

    /* Assignment of global variables */ 
    m = A + B; 
    n = A + B + C; 

    /* Some statements here */ 
    return 0; 
}