C言語では文字列を定義する際によく使います。
char *str = "test";
ここでの "test" は 定数文字列配列であり、これを str に代入すると、実際には 文字列配列"test" の最初のアドレスがstrに代入されます。したがって、二重引用符で囲まれた文字列を見た場合、それを直接アドレスとして扱うことができます。
そして、私たちが使用するキャラクターを定義するとき、
char c = 't'
これは、値't' をcに代入することを意味します。cに格納される値は、アドレスではなく't'の特定の値です。
これは C 言語を学習する際の常識のはずですが、マクロ定義に引用符を適用すると、いくつかの問題が発生することがあります。
#include <stdio.h>
#include <string.h>
#define MAX_PATH 260
#define TEST "\\"
int main(int argc, char *argv[]) {
char filename[MAX_PATH]="C:\\etc\\mte";
char *start = strrchr(filename, *"\\");
char *start = strrchr(filename, *TEST);
printf("start:%s \n", start);
system("pause");
return 0;
}
マクロ定義を使用する場合、一重引用符と二重引用符の違いを無視することがあります。たとえば、上記のコードではTESTを\として定義し、strrchr関数のパラメーターとして定義しています。ここで多くの人はchar *start = strrchr( filename, TEST) ; TESTの前に * を追加するのを忘れたため、エラーが発生しました。strrstr関数の 2 番目のパラメーターはcharですが、TEST は実際にはアドレスであるため、エラーが報告されます。ここでの*TESTは*"\\"に相当します。これは、アドレス"\\" \、*"\\"='\\'の下のコンテンツを取得することを意味します。