2015-08-20 26 views
0

我不是程序员,但我需要这样做! :)我的问题是我需要定义一些常量来设置或不设置我的代码的某些特定部分,并且最好使用#define而不是正常变量。代码是波纹管。根据之前所做的字符串比较,isample可以等于0,1,2或3。假设isample = 1,那么代码输出常量SAMPLE等于1,但是它会进入if isample == 0!定义有问题。发生什么事?还有另一种方法可以做到吗?testing #define CONSTANT

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 

    int isample = 1; 

#define SAMPLE isample 
    printf("\nSAMPLE %d", SAMPLE); 

#if SAMPLE == 0 
#define A 
#define AA 
    printf("\nA"); 
#elif SAMPLE == 1 
#define B 
    printf("\nB"); 
#elif SAMPLE == 2 
#define C 
    printf("\nC"); 
#else 
    printf("\nOTHER"); 
#endif 

    printf("\nBye"); 
} 

结果:

SAMPLE 1 
A 
Bye 

我也试过:

#define SAMPLE 4 
#undef SAMPLE 
#define SAMPLE isample 

,结果是一样的。

我也试过使用变量。除了使用#if块的,我用if

if (SAMPLE == 0) 
    { 
#define A 
#define AA 
     printf("\nA"); 
    } 
    else if (SAMPLE == 1) 
    { 
#define B 
     printf("\nB"); 
    } 
    else if (SAMPLE == 2) 
    { 
#define C 
     printf("\nC"); 
    } 
    else 
    { 
     printf("\nOTHER"); 
    } 
    int abc, def; 
#ifdef A 
    abc = 1; 
    def = 2; 
#endif 
#ifdef B 
    abc = 3; 
    def = 4; 
#endif 
#ifdef C 
    abc = 5; 
    def = 6; 
#endif 

    printf("\nabc %d, def %d\n", abc, def); 

结果:

SAMPLE 1 
B 
abc 5, def 6 

因此,所有的#define的被定义,不仅是选择一个,这将是BA, B and C定义了在同一组变量中工作的代码的一部分。我需要根据isample设置其中之一。

+2

宏的处理。他们不能访问普通的变量值。 – Barmar

+0

@JensGustedt定义了'A'和'AA','B'和'C'不是。未定义的标记被'0'替换为'#if'中的表达式评估目的 –

+0

所以要做我想做的事情,我有两个选择: 1)每次定义“SAMPLE”时,我运行代码; 2)使用正常变量,并取消所有我定义的“常量”。 我正在做选项1,但是我已经遇到了一些问题,当我忘记更改它时,并且由于代码需要很长时间才能运行,最好确保它能做正确的事情。我想我会选择选项2并重写代码... – Thaise

回答

2

您正在使用错误的方法来处理它。在运行时确定isample的值,而不是编译时间。

当您使用

#define SAMPLE isample 

到处编译器看到SAMPLE作为标记,它由isample替换令牌。这不是你想要的。您希望编译器将所有SAMPLE替换为值isample

您需要使用编译器标志来设置值SAMPLE。与海湾合作委员会,你可以使用:

gcc -DSAMPLE=1 ... 

和删除线的时候,程序编译,而不是在它的运行

#define SAMPLE isample 
+0

你是对的,但isample会在每次运行代码时改变。我不想把它“手工”(我到现在为止所做的)。所以也许最好的方法是不使用#define并使用变量重写所有这些部分。:/ – Thaise

+0

@Thaise,如果您想要在运行时根据'isample'的值更改要执行的代码分支,则需要使用'if-else'块,而不是'#if SAMPLE == xxx'块。 –

+0

但是,如果我在上面的代码中使用'if-else'块,所有'#define X'将被定义,而不仅仅是'if'选择的那个。问题是A,B和C定义了在同一组变量中工作的部分代码。我需要根据'isample'设置其中的一个。 – Thaise