C++ 32/64位构建之间的字符串格式方法一致性

C++ 32/64位构建之间的字符串格式方法一致性,c++,visual-studio,winapi,mfc,64-bit,C++,Visual Studio,Winapi,Mfc,64 Bit,在我的应用程序中(可以使用VisualStudio2008构建为32位和64位),为了一个特定的目的,我需要将结果输出到调试日志中。所以我这样做: BOOL* pbBool = function1(); CString str; str.Format(L"Line: pbBool=0x%I64X(%d)%s", pbBool, pbBool ? *pbBool : -1, bAddNewLine ? L"\n" : L"" ); 上面的代码适用于64位版本,但

在我的应用程序中(可以使用VisualStudio2008构建为32位和64位),为了一个特定的目的,我需要将结果输出到调试日志中。所以我这样做:

BOOL* pbBool = function1();

CString str;
str.Format(L"Line: pbBool=0x%I64X(%d)%s",
    pbBool,
    pbBool ? *pbBool : -1,
    bAddNewLine ? L"\n" : L""
    );
上面的代码适用于64位版本,但它会使32位版本的应用程序崩溃


我假设问题出现在“%I64X”中,我使用它是因为
pbBool
对于64位构建是64位的,对于32位构建是32位的。但我很好奇,是否有一个“格式”函数的“统一”说明符可以自动对此进行调整?

您的代码有两个问题:

  • 使用
    %I
    打印指针
    -您应该改用
    %p
    ,并且
  • 使用
    %s
    打印宽字符串
    -应改用
    %ls
修改后的格式行应如下所示:

L"Line: pbBool=0x%p(%d)%ls"

您可以使用
%p
打印指针。只需使用
I
而不是
I64
,它与ptrdiff\u tThanks匹配。出于好奇,VisualStudio的完整列表在哪里?另外,您是否打算执行“%p”而不是“%p64X”?“%ls”和“%s”之间有什么区别?@c0000fd完整的列表是。不过,使用Visual Studio时要小心-根据编译器的版本,它们对标准的遵从程度可能会有所不同。谢谢。这就是我的意思,有许多网站提供格式说明符,但有些网站不适用于VS。不过,我是否在该页面中缺少“%ls”和“%s”之间的差异,为什么我应该使用前者?@c0000fd差异反映在
%s
右侧的列中-您有列标题“(无)”和“
l
”。