在预处理时将sizeof()值转换为字符串

时间:2013-02-22 09:01:01

标签: c++ c string append sizeof

我必须将C代码与一些内联汇编结合起来。

我已经有了将枚举值和宏转换为字符串的简单机制:

#define STR(x) #x
#define DEF2STR(x) STR(x)

"string1 " DEF2STR(MACRO_VALUE_2) " string2"

预处理后的输出字符串为:“string1 2 string2”

问题是,如何将sizeof(type)值附加到字符串中?感谢。

4 个答案:

答案 0 :(得分:6)

你不能 - sizeof(type)将在宏替换发生后进行评估......在编译阶段的后期。

你为什么要这样做?也许有另一种方法来获得你真正想要的东西......

答案 1 :(得分:2)

此解决方案应该是可移植的:

#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);
}

答案 2 :(得分:1)

您可以使用泛型编程来构建数组,通过递归继承带有int(或更好的size_t)模板参数的模板化结构来构建数组,该模板参数除以10并将正确的字符添加到数组构建到自身。

虽然不会很漂亮。

答案 3 :(得分:1)

有趣的问题,所以我把这个编译时间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;
}