繁体   English   中英

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

[英]convert sizeof() value to string in preprocessing time

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

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

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

"string1 " DEF2STR(MACRO_VALUE_2) " string2"

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

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

您不能-在进行宏替换之后,将对sizeof(type)进行评估...稍后在编译阶段。

你为什么要这样做? 也许还有另一种方法可以完成您真正想要完成的工作。

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

#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(或更佳的size_t)模板参数的模板化结构来构建数组,该模板参数除以10,然后将正确的字符添加到数组构建中。

不会很漂亮。

有趣的问题,所以我将此编译时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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM