我必须将 C 代码与一些内联汇编结合起来。
我已经有了将枚举值和宏转换为字符串的简单机制:
#define STR(x) #x
#define DEF2STR(x) STR(x)
"string1 " DEF2STR(MACRO_VALUE_2) " string2"
预处理后的输出字符串为:“string1 2 string2”
问题是,如何将 sizeof(type) 值附加到字符串中?谢谢。
你不能 -sizeof(type)
将在宏替换发生后进行评估......稍后在编译阶段。
你为什么要这么做?也许还有另一种方法可以完成您真正想做的事情....
您可以使用泛型编程来构建数组,方法是递归地继承具有 int(或更好的 size_t)模板参数的模板结构,将其除以 10,并将正确的字符添加到构建到自身上的数组中。
不过不会很漂亮。
该解决方案应该是可移植的:
#include <stdio.h>
#include <limits.h>
#define STR1 "string1 "
#define STR2 " string"
#if (ULONG_MAX == 0xFFFFFFFFu)
#define LONGSIZE "4"
#elif (ULONG_MAX == 0xFFFFFFFFFFFFFFFFu)
#define LONGSIZE "8"
#endif
#define STR STR1 LONGSIZE STR2
int main()
{
puts (STR);
}
有趣的问题,所以我把这个编译时间 int 写成字符串“function”。请注意,您不能对 macors 执行此操作。我已经用 constexpr(C++11,用 gcc 4.7 测试)和模板完成了它。
typedef unsigned int uint;
// number of decimal digits in a number
constexpr int length(uint num) {
return num ? (length(num / 10) + 1) : 0;
}
uint constexpr decShift(uint num, int n) {
return n <= 0 ? num : decShift(num/10, n-1);
}
// return '\0' or the nth decimal digit of num
char constexpr intChar(uint num, int index) {
return index < 0 ? 0 : ( (decShift(num, index) % 10) + '0' );
}
// templated short array of char containing the digits
template<uint num> struct intToStr {
static constexpr uint n = length(num);
static constexpr char value[16] = {
intChar(num, n - 1),
intChar(num, n - 2),
intChar(num, n - 3),
intChar(num, n - 4),
intChar(num, n - 5),
intChar(num, n - 6),
intChar(num, n - 7),
intChar(num, n - 8),
intChar(num, n - 9),
intChar(num, n - 10),
intChar(num, n - 11),
intChar(num, n - 12),
intChar(num, n - 13),
intChar(num, n - 14),
intChar(num, n - 15),
0
};
};
template<uint num> constexpr char intToStr<num>::value[16];
// test with sizeof
int main() {
char array[1357];
std::cout << intToStr<sizeof(array)>::value << std::endl;
}