我刚开始学习C,但不确定所有工作原理。有些示例对我来说看起来很奇怪,我无法预测它将显示什么。我在GCC中编程,我的意思是它是我的编译器,所以我测试的每个代码都在GCC中。

我了解了指针等所有东西如何工作,但正如您所知道的,还有宏。宏非常奇怪,我发现了一个我没有解释的示例。例如看以下代码的特定代码:

#include <stdio.h>

int main(void){

  #define A 1

  if(A == 0){
    #define B 1
  }

  #ifdef B
    printf("B is defined, which means that A == 0.\n");
  #elif
    printf("B isn't defined, which means that A == 1.\n");
  #endif

  printf("Value of A is %d\n", A);

  return 0;
}

应该打印什么?好吧,虽然我很容易猜到,但是现在我发现这并不是很容易。结果不是我想的那样。

这是我的理由:我们首先将A定义为1,然后如果A0,则将B定义为1。因此,如果定义了B,则意味着A == 0,否则意味着A == 1。但是,令人惊讶地它打印:



什么?这只是矛盾。我不确定这在GCC中是否有些奇怪(因为我没有Visual Studio或其他编译器进行测试)。但是,我99%确信我以某种方式误解了宏。我尝试使用变量而不是宏,它可以正常工作。

这是一个问题,还是我只是误解了宏的工作原理?请记住,我是C初学者,所以请放轻松:)。

先感谢您。

最佳答案

在实际编译代码之前,宏是预处理器的一部分。编译器将在代码中搜索所有预处理器指令,并相应地修改代码。因此,当编译器使用if(A == 0) {#define B 1}时,它已经扩展为if(0 == 1) { }

使用宏可以轻松配置代码的某个方面,或将幻数替换为有意义的定义。例如:

#define DO_HOUR_CALCULATION

#define NUMBER_OF_SECONDS_PER_MINUTE (60)
#define NUMBER_OF_SECONDS_PER_HOUR (NUMBER_OF_SECONDS_PER_MINUTE * 60)
...
#ifdef DO_HOUR_CALCULATION
int hours = time / NUMBER_OF_SECONDS_PER_HOUR;
int minutes = (time % NUMBER_OF_SECONDS_PER_HOUR) / NUMBER_OF_SECONDS_PER_MINUTE;
#endif // defined(DO_TIME_CALCULATION)

另一个用途是简化重复或可配置的任务:
#define DEBUG

#ifdef DEBUG
#define DPRINTF(fmt, args...) printf(fmt, ## args)
#else
#define DPRINTF(args...)   do {} while (0)
#endif
...
ret = read(fd, p_buffer, buf_size);
DPRINTF("read(fd) returned %d\n", ret);

希望这对您有所帮助,并祝您编程愉快!

关于c - C-宏观矛盾,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44377855/

10-09 03:48