3
#define CONST_FILENAME "okay.dat"
LPCWSTR lpFilename=L CONST_FILENAME; //obviously doesn't work

基本的に、次のものに相当するものを取得するにはどうすればよいですか:

LPCWSTR lpFilename=L"okay.dat";

を使用して#defineいますか?

4

3 に答える 3

5
#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マクロが必要な理由については、私にとって意味のある説明を聞いたことがありませんが、それがないとマクロは拡張されないため、必須です。ここに詳細があるようです:##プリプロセッサ演算子のアプリケーションと考慮すべき落とし穴は何ですか?

于 2012-09-06T15:53:41.543 に答える
3

#define CONST_FILENAME L"okay.dat"

于 2012-04-07T04:11:38.450 に答える
2

CONST_FILENAMEしかし、[あまりにも] ASCII コンテキストで使用したい場合はどうすればよいでしょうか? そのような:

char *something = CONST_FILENAME;

Linと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)

于 2012-04-07T05:12:25.663 に答える