【发布时间】:2020-04-17 07:53:28
【问题描述】:
我有一个非常具体的问题。我有以下宏定义以供稍后在代码中使用。
#define MY_ARRAY { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 \
0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}
现在我想在编译期间反转排序并生成一个值,以便在编译期间直接嵌入到可执行文件中。所以基本上,我想要下面的代码
long x = DO_IT(MY_ARRAY);
long y = DO_TOO(MY_ARRAY);
这样在编译时
x = 0x7766554433221100;
y = 0xFFEEDDCCBBAA9988;
我的 DO_IT 和 DO_TOO 必须是什么样子才能正常工作?我真的在这个问题上苦苦挣扎,似乎找不到可行的解决方案。非常感谢任何帮助。
【问题讨论】:
-
你的数组总是有相同的元素吗?你能修改你的
MY_ARRAY宏,使它不包含大括号吗?为什么要使用宏而不是函数? -
它实际上包含 16 个元素(我会更新问题)。 64 位十六进制数。它确实包含大括号,因为稍后在我正在处理的遗留代码中需要它。
-
#define reverse(a, b) b, a?DO_IT是不可能的 - 不可能在预处理器中删除{}。您可以删除{}吗?还有0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF怎么了? -
但这不适合 64 位 int;你需要128位。如果您可以分两个阶段定义
MY_ARRAY- 一个不带大括号,另一个带大括号 - 然后您可以使用 bt-shifting 创建数字:#define(A0, A1, ...) (((A0) << 0) | ((A1) << 8) | ...) -
C 和 C++ 是不同的语言,C++ 可以进行比 C 更复杂的编译时计算(不基于宏)。选择您的语言。
标签: c++ c c-preprocessor