0

C コードとインライン アセンブリを組み合わせる必要があります。

列挙値とマクロを文字列に変換する簡単なメカニズムがすでにあります。

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

"string1 " DEF2STR(MACRO_VALUE_2) " string2"

前処理後の出力文字列は次のとおりです: "string1 2 string2"

質問は、sizeof(type) 値を文字列に追加するにはどうすればよいですか? ありがとう。

4

4 に答える 4

6

できません-sizeof(type)マクロ置換が行われた後に評価されます...コンパイルフェーズの後半です。

なぜそうしようとしているのですか?あなたが本当にやりたいことを実現する別の方法があるかもしれません....

于 2013-02-22T09:04:29.630 に答える
1

汎用プログラミングでそれを行うことができます。テンプレート化された構造体を int (またはより適切な size_t) テンプレート パラメーターで再帰的に継承することによって配列を構築し、それを 10 で割り、配列構築自体に正しい文字を追加します。

綺麗にはなりませんが。

于 2013-02-22T09:06:01.583 に答える
1

このソリューションは移植可能である必要があります。

#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);
}
于 2013-02-22T10:17:33.647 に答える
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;
}
于 2013-02-22T10:55:54.747 に答える