C语言 使用#ifdef进行条件编译与比较宏值的优缺点?

14ifxucb  于 2023-05-16  发布在  其他
关注(0)|答案(2)|浏览(123)

锁定18小时此问题的评论已被禁用,但仍在接受新的答案和其他交互。Learn more

我想用宏有条件地编译我的代码。这些问题中概述的通常方法:12345#define A_MACRO "and give it a value",然后使用#ifdef#if defined来确定它是否已定义。示例:

//#define A 0
#define B 0
//#define C 0

#ifdef A
    /*A stuff*/
#elif defined(B)
    /*B stuff*/
#else 
    /*C stuff*/
#endif

我只是有个想法,想做一些像这样的事情:

#define A 0
#define B 1
#define C 2

#define LETTER B

#if LETTER == A
    /*A stuff*/
#elif LETTER == B
    /*B stuff*/
#else
    /*C stuff*/
#endif

使用其中一种方法有什么好处或缺点吗?我个人认为第二种方法可读性更强,如果你不使用宏,也不需要注解掉它们。另外,必须给予宏一个不以任何方式使用的值也是违反直觉的。

szqfcxe2

szqfcxe21#

#define值由编译器的预处理器阶段拾取,并在单击以编译代码时进行处理。
在这里,你并没有将它们用作宏,因为它们不会替换代码,例如#define SUM(x,y) x+y,而是用来指示编译器应该处理或不应该处理的代码块。
通常,您会将这些作为预处理器指令的一部分,而不是在代码中定义它们。
对于预处理器指令,不需要任何值,你可以使用A、B或C --尽管我建议使用更长、更有意义的值。
然后你将使用你的第一个代码块

#ifdef A
    /*A stuff*/
#elif defined(B)
    /*B stuff*/
#else 
    /*C stuff*/
#endif

以这种方式使用时,不在适用的#if .. #endif逻辑内的代码将被排除在编译过程之外。因此,如果定义了A,则不会编译BC适用代码。

dfddblmv

dfddblmv2#

使用其中一种方法有什么好处或缺点吗?
我相信第二个应该是首选 * 当一个选项是选择多个路径 *,因为:

  • 只有一个配置位置-LETTER
  • 所有状态都在一个地方枚举,并且可以记录

相关问题