0
#include <stdio.h>

#define stringify(s)    tostring(s)
#define tostring(s)     #s

#define MAX_VALUE 65536
#define NUM 64 * 1024

enum {
    MIN_VALUE = 1024,
};

int main(int argc, char *argv[])
{
    const char *max_str = stringify(MAX_VALUE);
    const char *min_str = stringify(MIN_VALUE);
    printf("max = %s, min = %s\n", max_str, min_str);
    return 0;
}

出力は "max = 65536, min = MIN_VALUE num = 1024 * 64" です。専門家の皆様、コードを変更して次のように出力するにはどうすればよいですか: max = 65536, min = 1024 num = 65536

ありがとう 。

4

3 に答える 3

3

MIN_VALUEは数値です。なぜそれを文字列化する必要があるのですか?

使用するだけです:

printf("%d\n", MIN_VALUE);
于 2013-01-24T06:03:09.063 に答える
0

#defineステートメントは、コンパイラがコードを確認する前にプリプロセッサによって処理されるため、基本的にはテキスト置換です (実際には、パラメーターなどを使用するともう少しインテリジェントになります)。

stringify(s)isであるため#defined、プリプロセッサはそれを忠実に実行します。

stringify(MAX_VALUE)stringify(65536)MAX_VALUE が に #defined であるため、 に減衰します。これ65536は、前処理でも知られています。

ただしEnumerations、C 言語自体の一部であり、前処理では認識されないstringify(MIN_VALUE)ため、stringify(MIN_VALUE) として保持されるため、toString(MIN_VALUE)

整数演算または印刷

num = 65536

「はい」、プリプロセッサに整数演算を実行させる方法があります。これは、preprocessor条件で使用することです。

#if 1024*64 == 65536
    printf("num=65536\n");
#endif
于 2013-01-24T07:26:20.630 に答える
0

これには、マクロの代わりに関数を使用する方が良いと思います。その理由は、マクロはコンパイル時だけでなく、実行時も展開されないからです。

次の例を検討してください。

#define stringify(V) #V

#include <stdio.h>

int main()
{
    int x = 5;
    const char *str = stringify(x);
    printf("%s\n", str);
}

プリプロセッサが作業を完了すると、コードは次のようになります。

#include <stdio.h>

int main()
{
    int x = 5;
    const char *str = "x";
    printf("%s\n", str);
}

これは、すべてのプリプロセッサ ディレクティブ#が行うことは、指定されたパラメータを引用符で囲むためです。

定数、列挙型 (int へのキャスト)、および整数変数で動作する int から文字列への動作が必要な場合は、次を使用できますsprintf

#include <stdio.h>
#include <stdlib.h>

char *stringify(int x)
{
    /* get the length of the required buffer */
    int len = snprintf(0, 0, "%i", x);
    /* allocate memory */
    char *res = malloc(sizeof(char) * (len + 1));
    /* handle allocation failure */
    if(!res)
        return 0;

    /* convert the int to string */
    snprintf(res, len + 1, "%i", x);

    /* return the result */
    return res;
}

int main()
{
    int x = 5;
    char *str = stringify(x);
    printf("%s\n", str);
    /* we free the memory allocated by malloc */
    free(str);
}

これは、C でこれを行う 1 つの方法です。私が使用した関数について詳しく知りたい場合は、以下をご覧ください。

于 2013-01-24T06:27:33.537 に答える