C语言有没有DWORD数据类型?
你说的这是MFC的数据类型。
MFC中常见的数据类型如下:1、Win32程序共同使用的数据类型:BOOL:布尔值,取值为TRUE or FALSEBSTR:32-bit 字符指针BYTE:8-bit整数,未带正负号COLORREF:32-bit数值,代表一个颜色值DWORD:32-bit整数,未带正负号LONG:32-bit整数,带正负号LPARAM:32-bit整数,作为窗口函数或callback函数的一个参数LPCSTR:32-bit指针,指向一个常数字符串LPSTR:32-bit指针,指向一个字符串LPCTSTR:32-bit指针,指向一个常数字符串,此字符串可以移植到Unicode和DBCSLPTSTR:32-bit指针,指向一个字符串,此字符串可以移植到Unicode和DBCSLPVOID:32-bit指针,指向一个未指定类型的数据LPRESULT:32-bit数值,作为窗口函数或callback函数的返回值UINT:在Win16中是一个16-bit 未带正负号整数,在Win32中是一个32-bit 未带 正负号整数,WNDPROC:32-bit指针,指向一个窗口函数WORD:16-bit 整数 ,未带正负号WPARAM:窗口函数或callback函数的一个参数,在Win16中是16-bit,在Win32中是32-bit2、MFC独特的数据类型POSITION:一个数值,代表collection对象(例如数组或链表)中的元素位置,常 用于MFC collection classes(即数据处理类,如CArray)LPCRECT:32-bit指针,指向一个不变的RECT结构
C#与C数据类型是如何对应的
一般而言,C/C++与C#之间的数据类型对应如下:C/C++ C#int intunsigned int uintshort shortunsigned short ushortchar sbyte或者charbool(属于C++) boollong longunsigned long ulongstring(属于C++) string——————(WIndows API类型对应)DWORD、HANDLE、HDC、HWM、HPARAN、WPARAM、LPARAM、LPSTR、LPCSTR intWORD ushortDWORDLONG longBOOL bool………………
C语言中不同的数据类型的长度和什么有关
和编译器有关。
每种类型占用的字节数,是和编译器直接相关的,也就是常说的编译器的字长。
以整型系列的类型,char, short, int, long为例:1 16位字长: 对于16位编译器,char占1字节,short占2字节,int占2字节,long占4字节。
2 32位字长:对于32位编译器,char 占1字节,short占2字节,int占4字节,long占4字节。
3 64位字长:对于64位编译器,char占1字节,short占2字节,int占4字节,long占8字节。
一个C++程序 输出数据类型长度
上面大魔导师的说法不对,用这个例子就可以知道:#include#includevoid main() { struct example { char b; char c; int d; double a; short e; short f;}y; cout} 输出仍然是24,按照大魔导师的说法,应该是28才对……目前找到的最好的解释为:这里涉及到字节对齐,字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
在你的例子中:第一个double型占了8个字节,接下来的char b的偏移量是8,可以被sizeof(char)整除,因此它占用一个字节,char c偏移量是9,也占一个字节,int d偏移量是10,不是sizeof(int)=4的整数倍,要将其放到偏移量为12的位置,因此编译器在char c后填充了2个字节,使偏移量为12,int d占4字节,接下来的short e的偏移量为16,满足条件(2),short e占用2个字节,一共占用了18个字节,根据(3),编译器在short e后填充6个字节得到24字节;在我举的例子中,接下来再加1到3个short类型变量仍然为24个字节,但是如果添加4个short类型变量,则变为32个字节了更详细的全套说明在:http://blog.csdn.net/freefalcon/archive/2004/07/28/54839.aspx
double 类型反汇编代码
在 C++ 中,如果你从构造函数或者析构函数中调用虚拟函数,编译器调用的虚拟函数是定义在这个正在被构造的类实例中的(例如,如果从 Base::Base 中调用 Base::SomeVirtFn ),不是最底层派生的实例(the most derived instance),正像你说的那样,因为在最底层派生的构造函数执行之前,虚表还没有完全被初始化。
另一种说法是派生类还没有被创建。
Figure 2 虚拟函数 TestSimilarly正如你所指出的那样,在 C# 有所不同。
托管对象——无论是在 C#,托管 C++ 中,还是任何其它的 .NET 兼容语言中——是作为其最终类型被创建的,也就是说,如果你从构造函数或析构函数中调用虚函数,系统调用的是最末层派生的函数。
Figure 1 所示程序举例说明了这一点。
如果你编译并运行这个程序,你会看到 Figure 2 所示输出。
这种行为对于 C++ 程序员来说似乎有些奇特。
它意味着在派生类被初始化之前,你可以调用某个派生类型的虚拟函数——也就是说在其构造函数运行之前。
同样,如果你从基类析构函数中调用虚函数,该函数是在派生类被销毁之后运行的——也就是说在析构函数被调用之后。
那么先不说这种差别存在的原因,刚才不是还说从构造函数/析构函数中调用虚函数被认为是糟糕的实践。
为什么微软的家伙们要像这样来设计 C# 呢?因为它简化了内存管理。
垃圾收集器为了释放内存,它需要知道对象有多大。
如果 C# 像 C++ 那样构造对象,那么你可能会碰到这样一种情况:有两个对象,Obj1 和 Obj2,下面这两条语句都为真:typeof(Obj1)==typeof(Obj2) sizeof(Obj1)!= sizeof(Obj2) 因为对象之一是被部分构造。
(不要忘了垃圾收集器是异步运行的。
)通过将对象构造成最终类型,垃圾收集器能从其类型决定对象的大小。
如果 C# 像 C++ 那样进行部分构造,则垃圾收集器将需要更多的代码来决定部分构造对象的真实大小。
这样将带来复杂性和性能下降,首先要解决这个问题很让人气馁,所以为了较快的垃圾收集利益,微软的家伙们决定像上面那样来实现 C#。
有关这方面的讨论参见 Raymond Chen 的 blog:“The Old New Thing”。
问题: 在2004 三月的专栏中,你展示了如何改变文件打开对话框的最新视图状态设置,但没有涉及到保存这个用户使用的最新视图设置。
我遇到的问题是读取用户已有的打开文件对话框设置。
我只找到直接读取列表框信息的方法,但当用户选择缩略图模式时,那样做不能得到正确的信息。
对此你有没有解决办法? Maarten van Dillen 问题: 我正在用公共的 CFileDialog 类做开发,应该不是很难,但事情似乎并不是那样。
我想强制文件打开对话框的视图模式为缩略图。
我要用 Visual C++ 来做,你能否提供一些建议? Elliot Leonard答案: 有几个读者都在问文件打开对话框中的缩略图问题。
在我三月份的专栏中,我示范了如果向文件打开对话框中的 SHELLDLL_DefView 专用窗口发送 WM_COMMAND 消息以设置不同的视图模式——但你如何知道当前所处的模式是哪一个呢?你必须获取列表控件并调用 CListCtrl::GetView:// in dialog class HWND hlc = ::FindWindowEx(m_hWnd, NULL, _T("SysListView32"), NULL); CListCtrl* plc = (CListCtrl*)CWnd::FromHandle(hlc); DWORD dwView = plc->GetView(); CListCtrl::GetView 返回 LV_XXX 代码之一,但正像 Maarten 发现的那样,Windows 对图标模式和缩略图模式都返回 LV_VIEW_ICON。
那么如何区分到底是哪种视图模式呢?我绞尽脑汁并钻进头文件查找,最后发现一个叫 LVM_GETITEMSPACING 的消息,该消息是作什么用的呢——用来获取图标间隔。
顾名思义,图标间隔是图标视图模式中图标之间的像素间隔。
LVM_GETITEMSPACING 不是很好使用,以至于 MFC 都没有对之进行包装(比如说 MFC 中并没有 CListCtrl::GetIconSpacing 这样的函数)。
所以在 MFC 中你得自己发送消息:CSize sz = CSize(plc->SendMessage(LVM_GETITEMSPACING)); Windows 按照通常方式返回尺寸,在高位和低位字中编码的 cx/cy,然后CSize很礼貌地为你进行解码。
一旦有了图标间隔,你便可以将它与 GetSystemMetrics(SM_CXICONSPACING) 返回的系统间隔值进行比较。
如果列表视图的图标间隔与系统的一样,则视图是图标模式。
如果大于系统间隔,则视图为缩略图模式:if (sz.cx > GetSystemMetrics(SM_CXICONSPACING)) { // thumbnail view } else { // icon view } 讲了那么多缩略图,接下来的问题是如何持续化不同用户会话的视图状态?对此,当程序终止时,你需要用 Profile 函数在用户配置文件中保存最后使用的模式,并在下一次启动程序时再次恢复它。
我写了一个小示范程序,DlgTest。
程序使用了一个实现持续化程序行为的类 CPersistOpenDlg。
这个类又借助另外一个类 CListViewShellWnd,用它来封装 SHELLDLL_DefView 窗口(参见三月份专栏)。
CListViewShellWnd 包含获取和设置视图模式的函数,由这些函数来区分图标和缩略图模式:CListViewShellWnd m_wndLVSW; ... m_wndLVSW.SetViewMode(ODM_VIEW_THUMBS); CListViewShellWnd 的 OnDestroy 处理器在某个数据成员 ...