2
#define SATA_PORT_0   "/sata-ahci/port0"
#define SATA_PORT_1   "/sata-ahci/port1"
#define SATA_PORT_2   "/sata-ahci/port2"
#define SATA_PORT_3   "/sata-ahci/port3"
#define SATA_PORT_4   "/sata-ahci/port4"
#define SATA_PORT_5   "/sata-ahci/port5"

#define SATA_NODE(p)  HOW TO DEFINE THIS?!!

int main() 
{
    int i;
    for (i=0;i<6;i++)
    {
        printf("%s\n", i, SATA_NODE(i));
    }
    return 0;
}

質問: 上記のマクロを定義して、GCC で文字列を出力するにはどうすればよいですか?

4

5 に答える 5

3

マクロではなかなかできません。

問題は、マクロがコンパイル時の構成要素であり、そこにあるループが実行時の構成要素であることです。直接行うことはできません。

Boost Preprocessor (これは C++ 専用ではありません。C プリプロセッサでも動作します) を調査し、それを使用してループを生成するマクロを作成できます。

ループを手動でアンロールし、定数引数でマクロを使用できます。

#define SATA_PORT(i) "/sata-ahci/port" #i

printf("%s\n", 0, SATA_PORT(0));
printf("%s\n", 1, SATA_PORT(1));
printf("%s\n", 2, SATA_PORT(2));
printf("%s\n", 3, SATA_PORT(3));
printf("%s\n", 4, SATA_PORT(4));
printf("%s\n", 5, SATA_PORT(5));

または、文字列の配列を使用することもできます (削除された回答でも提案されています)。

#define DIM(x) (sizeof(x)/sizeof(*(x)))

const char * const sata_ports[] = 
{
    "/sata-ahci/port0",
    "/sata-ahci/port1",
    "/sata-ahci/port2",
    "/sata-ahci/port3",
    "/sata-ahci/port4",
    "/sata-ahci/port5"
};

for (int i = 0; i < DIM(sata_ports); i++)
    printf("%d %s\n", i, sata_ports[i]);
于 2011-11-10T03:42:35.750 に答える
1

上記の回答をありがとう。私はこれを自分で行う方法を見つけました。

#define SATA_PORT(p) (p==0)?SATA_PORT_0:ISP1
#define ISP1         (p==1)?SATA_PORT_1:ISP2
...

状況によっては、上記のマクロによってコードが大幅に改善されます。

于 2011-11-14T04:18:17.447 に答える
1

C言語ではできません。マクロ置換は、通常のコンパイルの前に発生します。プリプロセッサは、前処理トークン i が後で通常のコンパイル中に int として宣言されることを知りません。

実行はさらに後で行われます。コンパイラは i が 0 から 5 の範囲の値を持つことを理解できますが、それは役に立ちません。実際の割り当ては、コンパイルが完了した後、つまり前処理が完了した後の実行中に発生します。

于 2011-11-10T03:45:48.557 に答える
0

編集:私はソリューションを少し良くしました(GCCコンパイラで複合ステートメントが利用できるため)。

私が同様の問題を抱えていた場合、私は次のようにそれを解決します:

#define SATA_PORT(p) ({char prt[100]; sprintf(prt, "/sata-ahci/port%d", p); prt;})

printfそしてところで、あなたは変数のフォーマット指定子を忘れましiた。

于 2011-11-14T13:04:14.427 に答える
0

多分これはあなたが必要とするものです(ed):

#define STRINGIFY(x)                #x
#define TOSTRING(x)                 STRINGIFY(x)
#define SATA_NODE_TO_SATA_PORT(p)   SATA_PORT_##p
#define SATA_NODE(p)                TOSTRING(SATA_NODE_TO_SATA_PORT(p))

次に、前処理されたマクロを次のように印刷しようとすると、次のようになります。

std::cout << SATA_NODE(3) << " - " << SATA_NODE(5) << std::endl;
std::cout << SATA_NODE(7) << std::endl;

あなたが得るものは:

"/sata-ahci/port3" - "/sata-ahci/port5"
SATA_PORT_7
于 2013-03-04T14:11:04.003 に答える