草庐IT

c++ - size_t 类型变量的跨平台格式字符串?

这个问题在这里已经有了答案:What'sthecorrectwaytouseprintftoprintasize_t?(3个回答)关闭2年前.在跨平台c/c++项目(Win32、Linux、OSX)上,我需要使用*printf函数来打印一些size_t类型的变量。在某些环境中size_t是8个字节,而在其他环境中是4个。在glibc上我有%zd,在Win32上我可以使用%Id.有没有优雅的方法来处理这个问题? 最佳答案 PRIuPTR宏(来自)定义了uintptr_t的十进制格式,它应该总是足够大,以便您可以转换size_t不截断,

c++ - 为什么 printf 在打印十六进制时只打印一个字节?

pixel_data是char的vector。当我执行printf("0x%1x",pixel_data[0])我希望看到0xf5。但是我得到0xfffffff5就好像我正在打印一个4字节整数而不是1字节。这是为什么?我给printf一个char打印出来-它只有1个字节,那么为什么printf打印4?注意。printf实现封装在第三方API中,但只是想知道这是否是标准printf的功能? 最佳答案 您可能会遇到未定义行为的良性形式,因为%x修饰符需要一个unsignedint参数,而char通常会当传递给varargs函数时被提升为

c++ - 为什么 printf 在打印十六进制时只打印一个字节?

pixel_data是char的vector。当我执行printf("0x%1x",pixel_data[0])我希望看到0xf5。但是我得到0xfffffff5就好像我正在打印一个4字节整数而不是1字节。这是为什么?我给printf一个char打印出来-它只有1个字节,那么为什么printf打印4?注意。printf实现封装在第三方API中,但只是想知道这是否是标准printf的功能? 最佳答案 您可能会遇到未定义行为的良性形式,因为%x修饰符需要一个unsignedint参数,而char通常会当传递给varargs函数时被提升为

c++ - 为什么 "defau4t"在 switch 语句中是合法的?

这个问题在这里已经有了答案:Defaultcaseinaswitchcondition(3个回答)关闭8年前。我在其他网站上提出了这个程序并想尝试一下,程序如下:#includeintmain(){inta=10;switch(a){case'1':printf("one");break;case'2':printf("two");break;defau4t:printf("none");}return0;}令人惊讶的是,它编译时没有错误或警告。这怎么可能?关键字“default”没有错误吗?谁能解释这种行为? 最佳答案 token

c++ - 为什么 "defau4t"在 switch 语句中是合法的?

这个问题在这里已经有了答案:Defaultcaseinaswitchcondition(3个回答)关闭8年前。我在其他网站上提出了这个程序并想尝试一下,程序如下:#includeintmain(){inta=10;switch(a){case'1':printf("one");break;case'2':printf("two");break;defau4t:printf("none");}return0;}令人惊讶的是,它编译时没有错误或警告。这怎么可能?关键字“default”没有错误吗?谁能解释这种行为? 最佳答案 token

c++ - 如何创建一个只接受变量参数列表的调试函数?像 printf()

我想使用与printf相同的参数创建一个调试日志记录函数。但是可以在优化构建期间由预处理器删除。例如:Debug_Print("Warning:value%d>3!\n",value);我查看了可变参数宏,但这些宏并非在所有平台上都可用。gcc支持,msvc不支持。 最佳答案 我仍然使用旧方法,通过定义一个宏(XTRACE,如下),该宏与无操作或带有变量参数列表的函数调用相关。在内部,调用vsnprintf以便您可以保留printf语法:#includevoidXTrace0(LPCTSTRlpszText){::OutputDeb

c++ - 如何创建一个只接受变量参数列表的调试函数?像 printf()

我想使用与printf相同的参数创建一个调试日志记录函数。但是可以在优化构建期间由预处理器删除。例如:Debug_Print("Warning:value%d>3!\n",value);我查看了可变参数宏,但这些宏并非在所有平台上都可用。gcc支持,msvc不支持。 最佳答案 我仍然使用旧方法,通过定义一个宏(XTRACE,如下),该宏与无操作或带有变量参数列表的函数调用相关。在内部,调用vsnprintf以便您可以保留printf语法:#includevoidXTrace0(LPCTSTRlpszText){::OutputDeb

c++ - Arduino sprintf float 未格式化

我有这个arduino草图,chartemperature[10];floattemp=10.55;sprintf(temperature,"%fF",temp);Serial.println(temperature);温度输出为?F关于如何格式化这个float有什么想法吗?我需要它是一个字符字符串。 最佳答案 由于某些性能原因,%f未包含在Arduino的sprintf()实现中。更好的选择是使用dtostrf()-将浮点值转换为C风格的字符串,方法签名如下所示:char*dtostrf(doubleval,signedcharw

c++ - Arduino sprintf float 未格式化

我有这个arduino草图,chartemperature[10];floattemp=10.55;sprintf(temperature,"%fF",temp);Serial.println(temperature);温度输出为?F关于如何格式化这个float有什么想法吗?我需要它是一个字符字符串。 最佳答案 由于某些性能原因,%f未包含在Arduino的sprintf()实现中。更好的选择是使用dtostrf()-将浮点值转换为C风格的字符串,方法签名如下所示:char*dtostrf(doubleval,signedcharw

c++ - 混合 cout 和 printf 以获得更快的输出

在执行了一些测试后,我注意到printf比cout快得多。我知道它依赖于实现,但在我的Linux机器上printf快8倍。所以我的想法是混合两种打印方法:我想使用cout进行简单的打印,我计划使用printf来产生巨大的输出(通常在循环中).只要在切换到其他方法之前不要忘记刷新,我认为这样做是安全的:cout这样可以吗?更新:感谢所有宝贵的反馈。答案摘要:如果您想避免棘手的解决方案,只需坚持使用cout但不要使用endl因为它会隐式刷新缓冲区(减慢进程)。请改用"\n"。如果您产生large输出会很有趣。 最佳答案 直接的回答是可以