小编Die*_*hez的帖子

双重分配的评估顺序

我在我们的代码库中发现了一些东西,即使它从未失败过,但对我来说看起来并不"正确".

我已经将代码修剪成类似于链表的东西(数据结构比这复杂得多).

Node * node = firstNode();

while( moreNodesAwaiting() )
{
    Node * newnode = giveMeAnotherNode();

    node = node->next = newnode ; // <-- This is what I don't like.
}
Run Code Online (Sandbox Code Playgroud)

我不确定这里是否适用未定义的行为.我们正在修改数据结构和序列点之间的指针,但这与修改值两次不同.

此外,如果编译器可以按任何顺序计算表达式的元素,是否意味着它可以在赋值发生之前评估node-> next

为了以防万一,我把它改为:

    node->next = newnode ;
    node = node->next    ;
Run Code Online (Sandbox Code Playgroud)

这也强调了我们遍历清单的事实.

c++

9
推荐指数
1
解决办法
176
查看次数

有没有办法弃用命名空间?

简短:有没有办法在gcc或clang中弃用命名空间?

长:

多年来,我们一直在各种命名空间中积累所有类型的东西.现在我们决定将一些命令放入其中,并将命名空间拆分为正确命名的命名空间; 所以:

namespace util
{
uint32_t codecID( const char * name ) ;

void alignStrings( std::vector< std::string > * strings ) ;
}
Run Code Online (Sandbox Code Playgroud)

应该成为

namespace codec
{

uint32_t codecID( const char * name ) ;

}

namespace fmt
{

void alignStrings( std::vector< std::string > * strings ) ;

}
Run Code Online (Sandbox Code Playgroud)

只是为了增加乐趣,旧命名空间是在几个包含文件中定义的.其中的所有内容都是内联/模板代码; 所以没有与之相关的库.

显而易见的解决方案是将所有定义从旧命名空间复制到新命名空间,并将所有内容标记为旧的命名空间,逐个项目已弃用.

我们不能在不破坏多个项目的情况下重命名命名空间.

现在我想知道是否有更好的方法来做这样的事情,例如将namespace util的使用标记为已弃用.

我们使用gcc 4.7.3作为我们的生产编译器,但是对clang进行构建和测试以尝试捕获gcc细节; 所以在这些编译器上工作的东西会有所帮助.

c++ gcc namespaces clang

6
推荐指数
1
解决办法
494
查看次数

标签 统计

c++ ×2

clang ×1

gcc ×1

namespaces ×1