3

1から100までの約100個の#defineを含み、それぞれに一意の文字列値を持つファイルがあります。

今、この値を出力しようとしていますが、値の代わりに、#defineが何であるかを出力したいと思います。例えば:

#define FIRST_VALUE 1
var = FIRST_VALUE;
printf("%s", var);

そして、printfに1ではなくFIRST_VALUEを出力させたい。

Cでこれを行う方法はありますか?または、switchステートメント内に100以上のcaseブロックを書き出す必要がありますか?

4

3 に答える 3

12

文字列化を使用して、探しているものを実現できます。

  #define FIRST_MACRO
  #define MACRO_TO_STRING(x) #x

  #include <stdio.h>

  main() {
     printf("%s\n",  MACRO_TO_STRING(FIRST_MACRO));
  }

このプログラムは以下を出力します:

FIRST_MACRO
于 2009-02-08T00:39:01.337 に答える
1

学校の TA の 1 人と話し合った結果、ヘッダー ファイルを処理し、必要なすべてのケース ステートメントを自動的に生成する AWK スクリプトを作成するのが最善の方法であると判断しました。

みんなありがとう!

于 2009-02-09T17:16:44.543 に答える
0

コンパイラがプリプロセッサの出力を取得するまでに、「ONE」トークンがなくなってしまっているため、やりたいことを正確に行うことはできません。ただし、定数のリストを 1 回書き込み、トークンと文字列の両方を生成することが目標である場合は、これを行うことができます。

まず、マクロを使用して定数を列挙型としてヘッダー ファイルに作成します。ファイル enums.h:

#ifndef ENUMS_H
#ENUMS_H を定義

#ifndef ENUM
#define ENUM(name,val) enum { name = val };
#endif

ENUM(ONE,1)
ENUM(TWO,2)
ENUM(THREE,3)

#endif /* ENUMS_H */

次に、マクロを .c ファイルで再定義して、文字列/整数のマッピングを作成し、.h ファイルを適切な場所に含めます。ファイル enums.c:

#含む
#含む

typedef 構造体 {
        char *str;
        int 値;
} DescriptiveEnum;

static DescriptiveEnum enums[] = {
#define ENUM(name,val) { #name, val },
#include "enums.h"
};
#define NUM_ENUMS (sizeof(enums)/sizeof(enums[0]))

char *enum_to_str(int val)
{
        int i;
        for (i=0;i<NUM_ENUMS;i++) {
                if (enums[i].val == val) return enums[i].str;
        }
        戻る "";
}

これで、列挙型定数とマッピング関数の両方が呼び出し元で利用できるようになりました。ファイル main.c:

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

char *enum_to_str(int val);

int main(int argc, char *argv[])
{
        int 値;

        値 = 1;

        printf("%d %s\n",val,enum_to_str(val));

        EXIT_SUCCESS を返します。
}
于 2009-03-02T12:26:33.393 に答える