#define CONST_FILENAME "okay.dat"
LPCWSTR lpFilename=L CONST_FILENAME; //obviously doesn't work
基本的に、次のものに相当するものを取得するにはどうすればよいですか:
LPCWSTR lpFilename=L"okay.dat";
を使用して#define
いますか?
#define CONST_FILENAME "okay.dat"
LPCWSTR lpFilename=L CONST_FILENAME; //obviously doesn't work
基本的に、次のものに相当するものを取得するにはどうすればよいですか:
LPCWSTR lpFilename=L"okay.dat";
を使用して#define
いますか?
#define GLUE(x,y) x##y
#define W(x) GLUE(L,x)
#define CONST_FILENAME "okay.dat"
int main() {
const wchar_t* lpFilename = W(CONST_FILENAME);
const wchar_t* lpFilename = W("okay.dat");
wchar_t one_character = W('?');
}
http://ideone.com/2EzB6でのコンパイルの証明。これは、私が無条件に定義することを除いて、Microsoftの_T
マクロの動作とまったく同じです。したがって、MSVCの「Unicode」ビルドにない場合でも、このマクロを使用して幅の広い文字列を取得できます。GLUEマクロが必要な理由については、私にとって意味のある説明を聞いたことがありませんが、それがないとマクロは拡張されないため、必須です。ここに詳細があるようです:##プリプロセッサ演算子のアプリケーションと考慮すべき落とし穴は何ですか?
#define CONST_FILENAME L"okay.dat"
CONST_FILENAME
しかし、[あまりにも] ASCII コンテキストで使用したい場合はどうすればよいでしょうか? そのような:char *something = CONST_FILENAME;
L
inとby 空白を区切ることはL"okay.dat"
できません。"
wide-char 文字列は単一のトークンであり、直接「追加」することはできませんL
。しかし、文字列連結を行うことができます:
#include <wchar.h>
#define A_STRING "xyz.txt"
/* MMT - Magical Mystery Tour */
#define MMT(x) L"" x
char a[] = A_STRING;
wchar_t w[] = MMT(A_STRING);
よこしまですが、GCC は問題ありません。標準もそうなので、それでいいのです。これは C99 標準からのものです。
§6.4.5 文字列リテラル
¶4 変換フェーズ 6 では、隣接する文字列とワイド文字列リテラル トークンの任意のシーケンスによって指定されたマルチバイト文字シーケンスが、単一のマルチバイト文字シーケンスに連結されます。トークンのいずれかがワイド文字列リテラル トークンである場合、結果のマルチバイト文字シーケンスはワイド文字列リテラルとして扱われます。それ以外の場合は、文字列リテラルとして扱われます。
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <wchar.h>
#define A_STRING "xyz.txt"
/* MMT - Magical Mystery Tour */
#define MMT(x) L"" x
static char a[] = A_STRING;
static wchar_t w[] = MMT(A_STRING);
int main(void)
{
int len1 = wcslen(w);
int len2 = sizeof(w) / sizeof(w[0]) - 1;
int len3 = strlen(a);
int len4 = sizeof(a) / sizeof(a[0]) - 1;
assert(len1 == len2);
assert(len3 == len4);
assert(len1 == len3);
printf("sizeof(a) = %zu; sizeof(w) = %zu\n", sizeof(a), sizeof(w));
for (int i = 0; i < len1; i++)
printf("%d = %d\n", i, (int)w[i]);
for (int i = 0; i < len1; i++)
printf("%d = %d\n", i, (int)a[i]);
return(0);
}
gcc -O3 -g -Wall -Wextra -std=c99 xx.c -o xx
sizeof(a) = 8; sizeof(w) = 32
0 = 120
1 = 121
2 = 122
3 = 46
4 = 116
5 = 120
6 = 116
0 = 120
1 = 121
2 = 122
3 = 46
4 = 116
5 = 120
6 = 116
MacOS X 10.7.3 (ライオン)。64 ビット コンパイル。
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Apple Inc. ビルド 5658 に基づく) (LLVM ビルド 2335.15.00)