【问题标题】:testing #define CONSTANT测试#define CONSTANT
【发布时间】:2015-08-20 20:11:53
【问题描述】:

我不是程序员,但我需要去做! :) 我的问题是我需要定义一些常量来设置或不设置我的代码的某些特定部分,并且使用#define 比使用普通变量更好。代码如下。根据之前进行的字符串之间的比较,isample 可以等于 0、1、2 或 3。假设 isample = 1,那么代码打印出常量 SAMPLE 等于 1,但随后它进入 if isample == 0 !!!定义有问题。怎么了?还有其他方法吗?

#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设置其中之一。

【问题讨论】:

  • 宏是在程序编译时处理的,而不是在程序运行时处理的。他们不能访问普通的变量值。
  • @JensGustedt AAA 已定义,BC 未定义。为了在#if中进行表达式评估,未定义的标记被替换为0
  • 所以要做我想做的事,我有两个选择:1)每次运行代码时“手动”定义SAMPLE; 2)使用普通变量,去掉我定义的所有CONSTANT。我正在做选项 1,但我已经遇到了一些问题,当我忘记更改它时,并且由于代码需要很长时间才能运行,最好确保它会做正确的事情。我想我会选择选项 2 并重写代码...

标签: c constants c-preprocessor


【解决方案1】:

您使用错误的方法接近它。 isample 的值是在运行时确定的,而不是编译时。

当你使用

#define SAMPLE isample

编译器在任何将SAMPLE 视为标记的地方,都会将该标记替换为isample。那不是你想要的。您希望编译器将所有 SAMPLE 替换为 isample 的值。

您需要使用编译器标志设置SAMPLE 的值。使用 gcc,您可以使用:

gcc -DSAMPLE=1 ...

并删除该行

#define SAMPLE isample

【讨论】:

  • 你是对的,但是每次运行代码时 isample 都会发生变化。我不想“手动”设置它(我现在正在做的事情)。因此,也许最好的方法是不使用#define 并使用变量重写所有这些部分。 ://
  • @Thaise,如果您想在运行时根据isample 的值更改要执行的代码分支,您需要使用if-else 块,而不是#if SAMPLE == xxx块。
  • 但是如果我像上面的代码那样使用if-else 块,所有#define X 都将被定义,而不仅仅是if 选择的那个。问题是 A、B 和 C 定义了在同一组变量中工作的部分代码。我需要根据isample 设置其中之一。
  • @Thaise,我没有像您那样清楚地看到问题。如果您使用 if-else 块,也许您可​​以在帖子中添加更多信息来解释您认为的问题。
  • 我在上面添加了更多关于它的解释。
猜你喜欢
  • 2011-07-13
  • 2022-01-14
  • 1970-01-01
  • 2019-10-07
  • 2021-05-24
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 2020-06-28
相关资源
最近更新 更多