mie*_*dup 7 c macros c-preprocessor
通过宏实现功能是布尔的噩梦。我已经为(通用)函数的头部和主体定义了宏。使用布尔型时,结果很奇怪。
我知道,这通常是出于可维护性而需要避免的事情〜但就我而言,这是一组非常相似的回调函数和一个非常苛刻的缩写。
因此,目标实际上是可维护性和可读性,尤其是代码一致性。
#include <stdio.h>
#include <stdbool.h>
#define FUN_H(TYPE) \
  void fun_##TYPE( void )
#define FUN(TYPE) \
  FUN_H(TYPE) { \
    printf("Type is " #TYPE ".\n"); \
  }
FUN_H(int);
FUN_H(bool);
FUN(int);
FUN(bool);
int main(void) {
  fun_int();
  fun_bool();
}
阅读代码,我期望输出“ Type is int”。和“类型是布尔”。
实际上,要使代码编译(当前gcc / clang),必须将最后一次调用更改为fun__Bool();,并将标头更改为FUN_H(_Bool);-如果您知道C99却产生不连贯的代码,这实际上是有意义的。
_Bool直接使用类型FUN_H(_Bool);
FUN(_Bool); // or FUN(bool);
int main(void) {
  fun__Bool();
}
FUN()宏#define FUN(TYPE) \
  void fun_##TYPE( void ) { \
    printf("Type is " #TYPE ".\n"); \
  }
typedef 对于 _Booltypedef _Bool mybool;
FUN_H(mybool);
FUN(mybool);
int main(void) {
  fun_mybool();
}
bool成typedef#undef bool
typedef _Bool bool;
FUN_H(bool);
FUN(bool);
int main(void) {
  fun_bool();
}
那么,应该怎么办?
如果是宏FUN_H,则扩展bool为内部宏调用。如果您丢失了内部宏,则直接这样写:_BoolboolFUN_HFUN
#include <stdio.h>
#include <stdbool.h>
#define FUN_H(TYPE) \
  void fun_##TYPE( void )
#define FUN(TYPE) \
  void fun_##TYPE( void ) { \
    printf("Type is " #TYPE ".\n"); \
  }
FUN_H(int);
FUN_H(bool);
FUN(int);
FUN(bool);
int main(void) {
  fun_int();
  fun_bool();
}
那么您将获得fun_bool预期的结果,即使它bool是一个宏也是如此。
如前所述,传递TYPE给任何中间宏将在进一步处理之前强制其扩展。因此,在传递任何地方之前,必须尽早进行串联TYPE。为了在不重复太多的情况下实现它,我们可以委托给第三个宏
#define FUN_H(TYPE) \
  FUN_H_(fun_##TYPE)
#define FUN_H_(NAME) \
  void NAME( void )
#define FUN(TYPE) \
  FUN_H_(fun_##TYPE) { \
    printf("Type is " #TYPE ".\n"); \
  }