Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;有没有办法通过编程检测POD结构?_C++ - Fatal编程技术网

C++ C++;有没有办法通过编程检测POD结构?

C++ C++;有没有办法通过编程检测POD结构?,c++,C++,我有一个存储POD结构的数据结构(每个实例化只存储一个类型,因为它基本上是一个特定POD结构的数组)。有时,另一个开发人员会修改其中一个结构,添加或修改数据类型。如果添加了一个非POD元素,例如std::string,则数据结构会在运行时崩溃,因为内存模型会发生变化。有没有办法在运行时使用编译器定义或调用来检测类或结构是否与POD兼容(以避免此维护问题)?我正在使用g++(GCC)4.2.4。在运行时可能不会,但在编译时,您可以使用C++0x标准库或标准库中的is\u podtrait stat

我有一个存储POD结构的数据结构(每个实例化只存储一个类型,因为它基本上是一个特定POD结构的数组)。有时,另一个开发人员会修改其中一个结构,添加或修改数据类型。如果添加了一个非POD元素,例如std::string,则数据结构会在运行时崩溃,因为内存模型会发生变化。有没有办法在运行时使用编译器定义或调用来检测类或结构是否与POD兼容(以避免此维护问题)?我正在使用g++(GCC)4.2.4。

在运行时可能不会,但在编译时,您可以使用C++0x标准库或标准库中的
is\u pod
trait

static_断言(std::is_pod::value);

您可能可以使用BooSosiType特性库,尤其是 Boo:::在静态断言中,值。P> >如果您没有Boost或C++ 0x,那么您可以使用一些事实,例如C++不允许使用非POD作为联盟成员。< /P>解决这个问题的常用方法是代码审查。在这种情况下,评审通常无法检测到问题,尤其是在较大的代码库中。编译器支持是更好的方法。@John不是。代码检查是检测几乎所有代码语义(而非语法)问题的最佳方法。@Unaperson:我不同意这种情况。在编译器可能触发错误的所有情况下,它总是会触发错误,而代码审查可以跳过某些情况。有人可能正在容器中使用类型
X
,该类型可能包含另一个类型
Y
,该类型又包含
Z
。。。可能会被更改为非pod。由于类型
Z
从未在容器中直接使用,因此问题的根源和问题本身是分开的,在许多情况下不会被检测到。无论
Z
的定义有多远,编译器都可以比任何评论更早地理解它。@Unaperson:我的断言是基于经验的。我曾参与过许多多MLOC项目,这些项目中的对象如果被更改为非POD,就会出现问题,代码审查有时无法发现缺陷。当我们开发了编译时工具,当这些东西发生变化时,它会破坏编译,缺陷检测率立即达到100%。代码审查怎么可能比这更好呢?别误会我的意思,代码评审有很多原因,但它们并不是最终的结果。在C++03中,这只是解决方案的一半。您必须为自己的类型手动专门化模板,这将使您回到原点。有人在某个地方更改了一个类型,但是
is_pod::value
仍然生成true,因此后面的
static_assert
很高兴地通过了。总比什么都没有好,但你必须小心,这不会导致错误的安全感。@DennisZickeoose:取决于编译器。MSVC(至少>=2005,可能更老)、GCC>=4.3(我认为)和其他一些具有
所使用的内部函数。因此,如果您使用的是一个古老的或其他无法使用的编译器,那么是的,这可能不是一个好的解决方案。而且由于OP使用的是GCC4.2,这是一个非常重要的区别。@DennisZickeoose:啊,对。这个问题有一个简单的解决方案,不要使用过时的和不受支持的编译器我仍然认为is_pod是最好的方法,即使它需要编译器升级。这是一个很好的信息-谢谢你的回答。不幸的是,我不能在这一点上切换编译器-相信我,我希望我能。谢谢。这就是我所期待的。它写在不完美的C++:D中。
static_assert(std::is_pod<YourStruct>::value);