2

サンプルコード:

main()
{
    printf("%d\n", MARCO);  
//  printf("%s\n", MARCO);
}

オプションを使おうとするとgcc -D、次のコマンドが機能することがわかりました。

gcc -D MARCO=12345 test.c

しかし、12345を文字列に変更すると:

gcc -D MARCO=abcde test.c

エラーが発生します:

error: ‘abcde’ undeclared (first use in this function)

私は試しまし-DMARCO=abcde-DMARCO="abcde"、、-D MARCO="abcde"; すべてがそのエラーで失敗しました。

この-Dオプションは整数のみをサポートしますか?

4

3 に答える 3

16

問題は、二重引用符を(バックスラッシュで)エスケープするか、単一引用符で囲む(これを使用する)ことによってシェルがそうすることを妨げない限り、二重引用符がシェルによって認識されて削除されることです。

gcc -DMARCO='"abcde"' test.c

一重引用符はシェルによって削除されますが、これは二重引用符がCプリプロセッサによって認識されることを意味します。%sもちろん、このフォーマットを使用する必要があります。

マクロを変更することにより、コマンドラインで引用符で囲まれていない名前を文字列化できます。

#include <stdio.h>
#define STRINGIFY(x) #x
#define MACRO(x)     STRINGIFY(x)
int main(void)
{
    printf("%s\n", MACRO(MARCO));
    return(0);
}

それをでコンパイルするとgcc -o testprog -DMARCO=abcde test.c、正しい答えが得られることがわかります。

于 2012-12-25T12:37:45.240 に答える
2

マクロMARCOは文字通り入力した文字列に置き換えられ、その場合にのみコードがコンパイルされます。文字列の前後に引用符がないため(2つの例の二重引用符はシェルによって区切り文字として解釈されます)、abcdeは文字列としてではなく、識別子として解釈されます。定義されていないため、コードのコンパイルに失敗します。

于 2012-12-25T12:37:29.263 に答える
2

このように使用することもできます...

-DMACRO="\"abcde\""

参照:-D を含む引用符で囲まれた文字列をcmd.exeのgccに渡すにはどうすればよいですか?

于 2012-12-25T12:37:30.873 に答える