草庐IT

PORTABILITY

全部标签

c++ - 编译时检查右移是否是有符号类型的算术

我想知道在对有符号类型进行操作时检查右移是否算术的最便携方法是什么(例如-2>>1是否为-1)在编译时。我的想法是在编译时以某种方式检查它并能够检测到它,这样我就可以编译函数的不同版本(取决于运算符>>>是否真的是算术移位).通过阅读主题VerifyingthatC/C++signedrightshiftisarithmeticforaparticularcompiler?我想到了初始化一个标志staticconstboolis_arithmetic_rs=(((signedint)-1)>>1)==((signedint)-1));并像这样在运行时测试它:if(is_arithmet

c++ - 什么是 C++11 原子 API 等同于 `` `__asm__ volatile ("":::: "memory")`` `

一个代码库有一个COMPILER_BARRIER宏定义为__asm__volatile("":::"memory").宏的目的是防止编译器跨屏障重新排序读写。请注意,这显然是编译器屏障,不是处理器级内存屏障。事实上,这是相当可移植的,因为在AssemblerTemplate中没有实际的汇编指令,只有volatile和memory破坏。因此,只要编译器支持GCC的ExtendedAsm语法,它就应该可以正常工作。不过,我很好奇如果可能的话,在C++11原子API中表达这一点的正确方法是什么。以下似乎是正确的想法:atomic_signal_fence(memory_order_acq_r

c++ - 什么是独立于操作系统的方式来打开 C++ 中关联程序的文件?

用C++中的相关程序打开文件的独立于操作系统的方法是什么?Boost中是否有解决方案或类似的解决方案?更具体地说,涵盖Windows、MacOSX和Linux。我想做的是在用户已经设置为打开它的程序中打开一个以.txt扩展名结尾的文件,如果他们要通过单击它或命令行自己打开它的话。机制需要是异步的。 最佳答案 QDesktopServices::openUrl来自Qt库提供了这个。它是异步的(非阻塞的)。 关于c++-什么是独立于操作系统的方式来打开C++中关联程序的文件?,我们在Stac

c++ - 确定在 C++11 中实现大数的最有效字长?

通常bignums是通过使用多个单词来实现的,但我想选择尽可能便携的单词大小。这比看起来更棘手--std::uint64_t在许多32位编译器中可用,但std::uint32_t可能是更好的选择32位机器。因此,人们很想使用std::size_t,但对于给定的体系结构,不能保证std::size_t是最有效的算术类型,例如thenewx32LinuxABI。std::size_t将是32位,但std::uint64_t仍然是最佳选择。C++11定义了各种大小的快速/最小类型,但它没有提供任何查询它们相对性能的方法。我意识到可能没有最好的可移植答案,我现在最好的猜测是默认为std::si

c++ - 对于具有默认分配器的标准容器,std::container::size_type 是否保证为 size_t?

喜欢:std::string::size_typestd::list::size_typestd::map::size_typestd::vector::size_type等等两者都是cplusplus.com和cppreference.com说他们通常是size_t,但它们是否真正、明确地保证为size_t的标准除非使用自定义分配器? 最佳答案 对于STL容器-不。[container.requirements.general]中标准的表96,其中列出了任何容器的容器要求X,解释得很清楚:但是,对于basic_string,siz

c++ - 从文字字符串生成编译时常量整数

我对在ARMRealView编译器上按预期工作的不可移植代码有问题,但VC++、GCC拒绝编译它并且QAC++(一种静态分析工具)发出警告。问题我有一个系统需要解析消息中的助记符。助记符都是三个字符的8位ASCII字符串。为了简化和优化解析而不是对助记符字符串执行字符串比较,我将字符串打包成32位整数并执行整数比较。此外,为了能够使用switch/case而不是if-elseif链,我有一个宏,它接受一个文字字符串并生成关联的整数,这在ARMRealView中是一个编译时间常量,但在GCCx86/Linux或VC++/Windows://Note:DonotchangeCcasttos

c++ - 移植我的 C++ 应用程序以在浏览器中运行

有没有一种简单的方法可以将C++OpenGL应用程序移植到浏览器?它已经移植到PC、Mac和iOS。如果有一些相对简单的方法,它可以在计算机浏览器之间移植吗?当然,我必须为不同的平台使用不同的二进制文件。我记得前一段时间听说过一些关于Chrome的沙盒环境,但那会排除其他浏览器。他们(id?)在浏览器中如何处理Quake? 最佳答案 如果您已经将ES2.0用于iOS,您的着色器应该按原样使用WebGL.JavaScript嗨!id软件使用giantplugin用于QuakeLive。 关

c++ - 使用 `A<int>::template B<int> x;` 定义变量是否符合 C++ 标准?

这个问题在这里已经有了答案:WhereandwhydoIhavetoputthe"template"and"typename"keywords?(8个答案)关闭8年前。gcc、vc++和clang接受以下代码。templatestructA{templatestructB{};};intmain(){A::By;//OKasexpectedA::templateBx;//AlsoOK!Isthisstandard-compliant?};使用A::templateBx;定义变量是否符合C++标准??

c++ - Winsock 2 可移植性

我正准备用C++开发一些与套接字相关的东西,并希望该软件从一开始就尽可能在Windows和Linux之间可移植(稍后使其可移植很棘手。)我看过不同的库,有一个来自alhem.net的C++当然还有boost::asio。boost::asio看起来很有前途,但对于这么小的应用程序来说将是一个非常大的依赖。是否值得自己编写这些东西,还是我应该只使用库?如果我自己做,主要的陷阱是什么? 最佳答案 我开发了一些围绕套接字的可移植包装器。确保您不会走上由WinSock2事件构成的不归路。除此之外,在我看来,最大的区别是:要在Windows中

c++ - 在枚举定义中使用先前定义的成员作为后来成员的一部分是否合法?

namespaceValueType{enumEnum{Boolean=0,Float=1,Double,SInt=8,SLong,UInt=SInt+(1 最佳答案 是的——要求是它是一个完整的常量表达式。C++标准包括以下示例:enum{d,e,f=e+2}; 关于c++-在枚举定义中使用先前定义的成员作为后来成员的一部分是否合法?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question