我在我们的代码库中发现了一些东西,即使它从未失败过,但对我来说看起来并不"正确".
我已经将代码修剪成类似于链表的东西(数据结构比这复杂得多).
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)
这也强调了我们遍历清单的事实.
简短:有没有办法在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细节; 所以在这些编译器上工作的东西会有所帮助.