2013-02-22 34 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; 
} 
相關問題