#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"
char *something=CONST_FILENAME
? - IND000But what if I want to use
CONST_FILENAME
in an ASCII context [too]? Such as:
char *something = CONST_FILENAME;
L"okay.dat"
中的L
不能与"
之间有空格。宽字符字符串是一个单独的标记,你不能直接“将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)
_T
的作用,所以我也不知道要做什么才能让MMT实现_T
的功能。为什么不将这个作为你自己的答案提交呢? - Jonathan Leffler