#define 带有 L 标识符的语法
#define syntax with L identifier
#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"
但是,如果我也想在 ASCII 上下文中使用
CONST_FILENAME
怎么办?如: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) = %zun", sizeof(a), sizeof(w));
for (int i = 0; i < len1; i++)
printf("%d = %dn", i, (int)w[i]);
for (int i = 0; i < len1; i++)
printf("%d = %dn", 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 (Lion(。 64 位编译。
i686-Apple-Darwin11-LLVM-GCC-4.2 (GCC( 4.2.1 (基于 Apple Inc. build 5658( (LLVM build 2335.15.00(
相关文章:
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 语法错误:D3DX10Core 中的标识符'TEXTMETRICA'
- 错误 C2146:语法错误:标识符"A1"之前缺少","
- 主.cpp(12):错误 C2061:语法错误:标识符"vec1"
- 错误 C2146:语法错误:按函数传递映射时标识符 mType 之前缺少','
- 如何修复可视化工作室中的"C2061语法错误标识符"堆栈?
- 是否有任何法律语法允许引号出现在 javascript 中的标识符字符旁边?(如"so")
- 错误 C2061:语法错误:标识符'_bstr_t'
- C++结构错误 - 错误 C2061:语法错误:标识符
- 错误 CC2061:语法错误:标识符"GLUquadric"
- C2061:语法错误:qtypetraits.h 中的标识符'L'
- C++自定义头文件 - 语法错误 C2061:标识符
- 错误 C2061:语法错误:标识符'map'
- boost::p roperty_tree 编译错误(错误 C2061:语法错误:标识符"p")
- C++错误 C2061:语法错误:标识符'FILE' jpeglib 问题?
- 错误 C2061:语法错误:标识符'string'
- 错误 C2061:语法错误:使用 cURL 时标识符'acosf'
- #define 带有 L 标识符的语法
- 语法错误:编译 winnt.h 时缺少标识符'PVOID64'之前的';'
- 链表错误:语法错误:标识符'head'之前缺少';'