如何重命名C预处理器宏?

ale*_*xei 14 c macros

考虑一个(只读第三方)标头lib.h:

#define XYZ 42
Run Code Online (Sandbox Code Playgroud)

在源文件中,我想将该单词XYZ用于不相关的目的,并且不希望替换为42.但是,相同的源文件中,用于其他用途,我也确实想访问该值42lib.h没有硬编码.如何将宏重命名XYZ为,比如说LIB_XYZ

以下是不行的,因为预处理器要XYZ在时间LIB_XYZ替换发生,但XYZ一直没有定义:

#include "lib.h"
#define LIB_XYZ XYZ
#undef XYZ
Run Code Online (Sandbox Code Playgroud)

有没有办法欺骗预处理器LIB_XYZXYZ丢失之前扩展到它的最终值?

5go*_*der 6

不是预处理器,至少不是我所知道的.

但是,对于具有已知类型的简单常量(如示例),有一种解决方法.

#include <stdio.h>

// <xyz.h>

#define XYZ 42

// </xyz.h>

enum xyz_constants
{
  LIB_XYZ = XYZ,
};

#undef XYZ

#define XYZ 27

int
main()
{
  printf("old value: %d, new value: %d\n", LIB_XYZ, XYZ);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

未显示绒毛stdio.h,此代码已预处理到以下内容.

enum xyz_constants
{
  LIB_XYZ = 42,
};

int
main()
{
  printf("old value: %d, new value: %d\n", LIB_XYZ, 27);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

您可以在某种程度上将其扩展到其他数据类型和某些类似函数的宏,但当然有限制.

无论如何,为什么你需要特定的标识符XYZ?你不能为你的宏使用不同的名字吗?