草庐IT

Static-Stack-Usage-Analysis

全部标签

c++ - "static enum"在 C++ 中是什么意思?

我最近遇到了这个:staticenumResponse{NO_ERROR=0,MISSING_DESCRIPTOR,...};它在MicrosoftVS2005下编译和工作。但是,我不确定“静态”修饰符应该做什么。和下面有什么不同吗?enumResponse{NO_ERROR=0,MISSING_DESCRIPTOR,...}; 最佳答案 仅删除省略号的确切代码不是有效的C++。您不能在enum声明中使用static存储类说明符;它在那里没有任何意义(只有对象、函数和匿名union可以声明为static)。但是,您可以在一个声明中声

c++ - 对非指针类型使用 static_cast 而不是 C 风格的强制转换有什么好处吗?

我很清楚使用static_cast而不是C风格的指针类型转换的优势。如果指针类型不兼容,则:static_cast将在源代码中的特定行产生编译时错误C风格的转换可能会在程序执行的“随机”点导致运行时错误但我找不到任何非指针类型的类似示例。换句话说,两种转换方法对非指针类型产生相同的结果。这是正确的,还是我错过了什么?如果是,static_cast是否仅用于非指针类型以保持编码一致性? 最佳答案 其他两个答案尚未提及的一个优点是static_cast更容易发现。众所周知,括号的含义在C++中被重载,并且很难发现邪恶的(甚至不正确的)强

c++ - 对非指针类型使用 static_cast 而不是 C 风格的强制转换有什么好处吗?

我很清楚使用static_cast而不是C风格的指针类型转换的优势。如果指针类型不兼容,则:static_cast将在源代码中的特定行产生编译时错误C风格的转换可能会在程序执行的“随机”点导致运行时错误但我找不到任何非指针类型的类似示例。换句话说,两种转换方法对非指针类型产生相同的结果。这是正确的,还是我错过了什么?如果是,static_cast是否仅用于非指针类型以保持编码一致性? 最佳答案 其他两个答案尚未提及的一个优点是static_cast更容易发现。众所周知,括号的含义在C++中被重载,并且很难发现邪恶的(甚至不正确的)强

c++ - std::stack 是否公开迭代器?

C++STL中的std::stack是否公开了底层容器的任何迭代器,还是应该直接使用该容器? 最佳答案 根据堆栈的定义,堆栈没有迭代器。如果您需要带有迭代器的堆栈,您需要自己在其他容器(std::list、std::vector等)之上实现它。Stackdocishere.附:根据我从Iraimbilanja得到的评论,std::stack默认使用std::deque来实现。 关于c++-std::stack是否公开迭代器?,我们在StackOverflow上找到一个类似的问题:

c++ - std::stack 是否公开迭代器?

C++STL中的std::stack是否公开了底层容器的任何迭代器,还是应该直接使用该容器? 最佳答案 根据堆栈的定义,堆栈没有迭代器。如果您需要带有迭代器的堆栈,您需要自己在其他容器(std::list、std::vector等)之上实现它。Stackdocishere.附:根据我从Iraimbilanja得到的评论,std::stack默认使用std::deque来实现。 关于c++-std::stack是否公开迭代器?,我们在StackOverflow上找到一个类似的问题:

c++ - 在将 void* 转换为任何内容时,我应该使用 static_cast 还是 reinterpret_cast

static_cast和reinterpret_cast似乎都可以很好地将void*转换为另一种指针类型。是否有充分的理由偏爱其中一个? 最佳答案 使用static_cast:它是准确描述此处进行的转换的最窄类型。有一种误解,认为使用reinterpret_cast会更好,因为这意味着“完全忽略类型安全,只是从A转换为B”。但是,这实际上并没有描述reinterpret_cast的效果。相反,reinterpret_cast有多种含义,所有含义都认为“reinterpret_cast执行的映射是实现定义的”。[5.2.10.3]但在

c++ - 在将 void* 转换为任何内容时,我应该使用 static_cast 还是 reinterpret_cast

static_cast和reinterpret_cast似乎都可以很好地将void*转换为另一种指针类型。是否有充分的理由偏爱其中一个? 最佳答案 使用static_cast:它是准确描述此处进行的转换的最窄类型。有一种误解,认为使用reinterpret_cast会更好,因为这意味着“完全忽略类型安全,只是从A转换为B”。但是,这实际上并没有描述reinterpret_cast的效果。相反,reinterpret_cast有多种含义,所有含义都认为“reinterpret_cast执行的映射是实现定义的”。[5.2.10.3]但在

c++ - 为什么涉及虚拟继承时不能使用static_cast进行向下转换?

考虑以下代码:structBase{};structDerived:publicvirtualBase{};voidf(){Base*b=newDerived;Derived*d=static_cast(b);}这是标准禁止的([n3290:5.2.9/2])所以代码无法编译,因为Derived虚拟继承自Base。从继承中删除virtual使代码有效。此规则存在的技术原因是什么? 最佳答案 技术问题是无法解决Base*Base开头之间的偏移量是多少子对象和Derived的开始目的。在您的示例中,它看起来没问题,因为只看到一个带有Ba

c++ - 为什么涉及虚拟继承时不能使用static_cast进行向下转换?

考虑以下代码:structBase{};structDerived:publicvirtualBase{};voidf(){Base*b=newDerived;Derived*d=static_cast(b);}这是标准禁止的([n3290:5.2.9/2])所以代码无法编译,因为Derived虚拟继承自Base。从继承中删除virtual使代码有效。此规则存在的技术原因是什么? 最佳答案 技术问题是无法解决Base*Base开头之间的偏移量是多少子对象和Derived的开始目的。在您的示例中,它看起来没问题,因为只看到一个带有Ba

c++ - 当两个链接的 static_cast 可以完成它的工作时,为什么我们在 C++ 中有 reinterpret_cast?

假设我想将A*转换为char*反之亦然,我们有两个选择(我的意思是,我们中的许多人认为我们有两个选择,因为两者似乎都有效!因此困惑!):structA{intage;charname[128];};Aa;char*buffer=static_cast(static_cast(&a));//choice1char*buffer=reinterpret_cast(&a);//choice2两者都可以正常工作。//convertbackA*pA=static_cast(static_cast(buffer));//choice1A*pA=reinterpret_cast(buffer);//