2014-03-30 49 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; 
}