草庐IT

c++ - 为什么 GCC 不强制 __attribute__((pure)) 函数中的参数为常量?

以下代码在GCC4.2下编译时没有警告,据我所知,它确实不应该:#include__attribute__((pure))doubleUnpureFunction(double*x){x[0]=42;return43;}intmain(){doublex[]={0};doubley=UnpureFunction(x);printf("%.2f%.2f\n",x[0],y);}(打印“42.0043.00”。)据我了解,pure属性告诉编译器该函数没有外部影响(请参阅“pure”部分here)。但是UnpureFunction正在修改它的参数。为什么允许这种情况发生?至少,编译器可以自动

c++ - 如果存在具有特定名称的结构成员,则强制编译失败

假设bad_name是一个受限制的标识符,例如我不想成为该结构的一部分。在这种情况下,我正在寻找一种强制编译失败的机制。例子.hstructexample{intokay_name;intbad_name;}主.cc#include"example.h"intmain(){exampleex;//causecompilationtofailhereifbad_nameisamemberofexreturn0;}可能有一些方法可以通过模拟反射在运行时导致失败,但是有没有办法在编译时做到这一点? 最佳答案 您可以将bad_name定义为

c++ - 如何强制 Visual Studio 使用 wmain 而不是 main

我需要解析unicode参数,所以我想使用wmain相反。所以代替intmain(intargc,char**argv)我想用intwmain(intargc,wchar_t**argv)问题是visualstudio无法识别wmain,而是尝试使用main:errorLNK2019:unresolvedexternalsymbolmainreferencedinfunction__tmainCRTStartup这是我尝试过的:更改属性->常规->字符集更改入口点(在这种情况下,我遇到了很多甚至没有入口点的库的兼容性错误,因此无法在那里指定)。warningLNK4258:direct

c++ - 如何强制调用 move 构造函数(C++)?

我有这对代码行:#includeusingnamespacestd;classA{public:A()noexcept{cout他们产生这个输出:A::A()A::A(constA&)A::A()A::A(constA&)我需要做什么才能从B::B(A&&)调用A::A(A&&)?如您所见,添加noexcept并不能解决这个问题。 最佳答案 尽管a的类型是对A的右值引用,但a本身是一个左值。要保留其右值性,您需要使用std::move:B(A&&a)noexcept:_a(std::move(a)){}

c++ - 键入强制转换文字有意义吗?

所以我正在研究内存受限的嵌入式系统,并希望尽可能多地节省字节数。如果,在我的代码中,如果我有如下语句:b=a或b+=1;其中a和b是uint8_t。将文字类型转换为相同类型是否有益,还是由编译器完成:b=a 最佳答案 isitbeneficialtotyecasttheliteraltosametypeorisitdonebycompiler:关于编译器如何将常量值存储在它创建的二进制文件中,您受制于编译器。没有特别的理由认为像您建议的强制转换会改变使用的表示形式,因为它们名义上表示runtime转换(在这种情况下来自int)。此外

c++ - 按位将 uint32_t 强制转换为 C/C++ 中的 float

我正在从网络接收缓冲区,该缓冲区已转换为32位字数组。我有一个词被我的接口(interface)文档定义为IEEE-754float。我需要从缓冲区中提取这个词。在不调用转换的情况下很难从一种类型转换为另一种类型。这些位已经符合IEEE-754浮点标准,我不想重新安排任何位。我的第一个尝试是将uint32_t的地址转换为void*,然后将void*转换为float*,然后解引用为float:floatieee_float(uint32_tf){return*((float*)((void*)(&f)));}error:dereferencingtype-punnedpointerwil

c++ - 在 C++ 的子类中强制执行静态方法重载

我有这样的东西:classBase{public:staticintLolz(){return0;}};classChild:publicBase{public:intnothing;};templateintProduce(){returnT::Lolz();}和Produce();Produce();两者都返回0,这当然是正确的,但不需要。无论如何在第二个类中强制执行Lolz()方法的显式声明,或者在使用Produce()时可能抛出编译时错误?还是OO设计不好,我应该做一些完全不同的事情?编辑:我基本上想做的是做这样的事情:Managermanager;manager.Regist

c++ - 如何强制所有派生类实现虚方法?

假设您有一个类树的基类Dep。有一个虚拟方法Dep*Dep::create()我希望每个叶类都实现它。有什么办法可以强制执行此操作吗?注意:这里的问题是可能有中间类(比如classB:publicA:publicDep)通过以下方式实现此方法(A::create)意外或因为他们认为他们是叶类,但实际上他们自己是子类。问题到此结束。上下文如果你好奇我为什么需要这个;我有一个Master类,它具有未知具体类型的Dep对象。如果Master是重复的,我需要拿出Dep实例的匹配克隆。下一个最好的办法是虚拟构造函数惯用语,它恰好引入了这个问题。此外,我什至无法捕捉到这一点(除了可怕的崩溃),因为

c++ - 使用 malloc() 强制垃圾收集/压缩

我有一个C++程序,可以对不同长度的输入数组的各种算法进行基准测试。它看起来或多或少像这样:#(1)forkinrange(4..20):#(2)input=generate2**krandompointsforvariantinvariants:benchmarkthefollowingcallrunvariantoninputarray#(3)是否可以将(2)处的整个堆管理重置为它在(1)处的状态?在程序期间分配的堆上分配的所有内存保证在(3)处释放。我在Linux上使用g++4.3。编辑:我知道C/C++中没有真正的垃圾回收。我想强制内存分配连接它在(2)处的空闲列表中的相邻空内

c++ - 你如何强制编译器在 C++ 中通过引用传递一些变量?

这是一个简单的例子;templatevoidfoo(Tt){}std::stringstr("somehugetext");foo(str);我的问题是如何强制编译器通过引用传递str不修改函数foo? 最佳答案 显式传递引用类型:templatevoidfoo(Tt){}intmain(){std::stringstr("somehugetext");foo(str);}这确实修改了您获得的函数实例化(通过生成voidfoo(std::string&t)),但它不会修改函数模板。Livedemo.