考虑一个(只读第三方)标头lib.h:
#define XYZ 42
Run Code Online (Sandbox Code Playgroud)
在源文件中,我想将该单词XYZ用于不相关的目的,并且不希望替换为42.但是,相同的源文件中,用于其他用途,我也确实想访问该值42从lib.h没有硬编码.如何将宏重命名XYZ为,比如说LIB_XYZ?
以下是不行的,因为预处理器要XYZ在时间LIB_XYZ替换发生,但XYZ一直没有定义:
#include "lib.h"
#define LIB_XYZ XYZ
#undef XYZ
Run Code Online (Sandbox Code Playgroud)
有没有办法欺骗预处理器LIB_XYZ在XYZ丢失之前扩展到它的最终值?
不是预处理器,至少不是我所知道的.
但是,对于具有已知类型的简单常量(如示例),有一种解决方法.
#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?你不能为你的宏使用不同的名字吗?
| 归档时间: |
|
| 查看次数: |
2157 次 |
| 最近记录: |