2013-02-22 89 views
0

我必须将C代码与某些行内汇编组合在一起。在预处理时间将sizeof()的值转换为字符串

我媒体链接有简单的机制,将我的枚举值和宏成字符串:预处理后

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

"string1 " DEF2STR(MACRO_VALUE_2) " string2" 

输出字符串为:“字符串1 2字符串2”

的问题是,我怎么能追加的sizeof(类型)值转换为字符串?谢谢。

+0

类型转换应该有帮助吗? – 2013-02-22 09:05:13

+0

[size of size \ _t preprocessor value]的可能重复(http://stackoverflow.com/questions/14938231/size-of-size-t-preprocessor-value) – alk 2013-02-22 12:03:24

+0

预处理器不会执行sizeof。这是在编译阶段的后期。 – 2013-02-22 14:16:46

回答

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); 
} 
+0

好主意。谢谢。 – Mihalko 2013-02-22 10:25:24

6

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

你为什么要这么做?也许还有另外一种方法可以得到你真正想做的东西......

+0

我必须为asm()编译指示符创建字符串,以便通过sizeof(long value)来注册。 – Mihalko 2013-02-22 09:11:41

+0

@Mihalko:使用哪种编译器和汇编语言? – 2013-02-22 09:15:26

+0

对不起,使用gcc 4.7编译器和gnu89标准,英特尔语法中的汇编语言 – Mihalko 2013-02-22 09:17:43

1

你可以用泛型编程来实现,通过递归地继承一个模板化的结构来构建一个int(或者更好的size_t)模板参数, 10并将正确的字符添加到自身的阵列构建中。

虽然它不会很漂亮。

+1

可能会更漂亮与来自C++ constexpr 11 – Antoine 2013-02-22 09:08:34

+0

@Antoine我不这么认为,因为没有第一类字符串和C + +不知道如何连接字符串文字从递归调用AFAIK – wich 2013-02-22 09:15:22

+0

事实上,我没有找到了一种用constexpr构建字符串的方法,但在下面发布了一个带有模板的解决方案。 – Antoine 2013-02-22 12:08:50

1

有趣的问题,所以我写了这个编译时INT为字符串“功能”。请注意,你不能用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; 
} 
相关问题