2010-04-01 52 views
0

在过去的2年里,我一直在linux上使用C++,并且最近转向了windows C++编程。SHLoadImageFile(L“\ Program Files \ TrainingApp \ background.png”); L在争论中是什么?

谁能告诉我,L是什么存在的函数的自变量:

SHLoadImageFile(L"\\Program Files\\TrainingApp\\background.png"); 

,并在MSVS C查看某些示例代码+我碰到hundereds类型定义的一样..

LPARAM // typedef的LONG_PTR LPARAM ...这里LONG_PTR再次作为typedef的长__w64

WPARAM // typedef的UINT_PTR WPARAM ...

所以有很多链式typedefs ..我从来没有看到这么多的typedef链接在Linux上使用gcc的C++编程..

我想说的是,它只是在这种方式创建更多的混淆窗口应用程序编程..虽然我见过使用类似Qt的框架在Linux上进行应用程序编程..有这样的事情很少使用..所以在MSVSC++中一次又一次地定义类型的具体目的是什么?例如..有像typdefs像

typedef int BOOL; 

这是什么使用这个时,正常的布尔已经可用.. ??还有其他一百种情况,我只是想知道要使用哪种数据类型变得如此困难..它也变得很难理解预先编写的代码。

谢谢。

+0

即使msdn页面也没有告诉任何有关参数L的内容.. http://msdn.microsoft.com/en-us/library/bb416681.aspx – ashishsony 2010-04-01 09:33:45

+1

因为在记录SHLoadImageFile函数时C语言细节是无关紧要的。你会让他们在每个使用TCHAR类型的页面上解释它吗? – 2010-04-01 09:54:03

回答

2

参数中的L是告诉编译器以下字符串文字是unicode而不是单字节字符的标准方式。它相当于后缀L来表示一个长整型常量。

Windows的typedefs确实让人感到困惑,但是一旦你开始了解命名体系,就会开始有意义。

你必须记住,这个API起源于90年代初。因此typedef被要求处理不同体系结构以及32/64位类型的指针,并且还需要为非intel Windows机器编译。

BOOL-> int映射是必需的,因为接口是C兼容的(不是C++),因此不能使用内置的bool类型。

0

L告诉编译器使用Unicode字符串。

还有一个_TEXT宏,可以帮助创建针对Unicode和非Unicode平台的程序。它被定义为:

#define _TEXT(t) t  // this does noting 

#define _TEXT(t) L ## t // Adds L in front of the string 

最后TCHAR能够存储在1首或2个字节:

TCHAR mystring[] = _TEXT("text"); 

TCHAR被设置为等于一个wchar_t的当_UNICODE被定义时,以及不是时的char。

0

字符串文字前面的L是使它成为一个宽字符串(这是一个unicode字符串)。

你问的其他事情基本上是历史的。请记住,Windows遗留物只能在C面向对象(某种)事件驱动的API中弯曲。这一切都回到Win16(基本上在Windows 95之前)。另外请记住,微软总是有一个非常长时间的API和奇怪的编码习惯的诀窍。这就是为什么你看到像bool这样的东西被定义为一个int(回到当天C没有布尔)。

您提到LPARAM和WPARAM ...这些都回到Win16/23编程,并且是在Win16/32/64消息泵中传递的两个参数。 L代表长(因为它是一个长类型),W代表Word,因为它就是这样。这些值根据消息保存不同的参数(例如,对于一个窗口点击事件,它可能包含LPARAM中的指针,指向包含点击事件坐标的结构)。

我相信在决定使用哪种类型时,这些都不会帮助您...我唯一可以推荐的是,如果您需要这样做,您可以了解更多关于传统Windows编程的知识。但如果我是你,并且你在Linux上使用过类似Qt的东西,并且希望编写Windows代码...为什么不试试Qt for Windows并使用它?它会隐藏你的大部分内容(坦率地说已经过时)。

希望这会有所帮助!

+0

哈哈雅我会更喜欢Qt,但项目我参与要求VSC++所以没有选择..其基本上从这个设备的游戏移植工作到.. ..gameloft .. :)谢谢你的解释方式... – ashishsony 2010-04-01 10:40:56

+1

@ashishony:Qt和MSVC++不是互斥的。我使用MSVC和Qt构建了许多严肃的项目。 – MSalters 2010-04-01 12:11:05

2

L是标准C语言,在Linux下也是有效的。它表示字符串文字是,用于实现广泛的定义。参见C99规范的6.4.5。

当使用L前缀时,数组元素的类型是wchar_t而不是char

相关问题