小编JRM*_*JRM的帖子

使用-isystem代替-I和CMake

在使用gcc构建时,CMake中是否有任何方法强制通过include_directories(或者可能通过不同的函数)指定的路径使用-isystem标志而不是-I标志?

有关-I和-isystem的详细信息,请参阅http://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html#Directory-Options.

gcc build cmake

48
推荐指数
2
解决办法
1万
查看次数

在迭代时附加到向量?

我有一个迭代的矢量.在迭代时,我可能会向向量添加新值.它看起来像:

struct Foo
{
   bool condition;
};

void AppendToVec(vector<Foo>& v)
{
   ...
   v.push_back(...);
}

vector<Foo> vec;
...
for (vector<Foo>::size_type i = 0; i < vec.size(); ++i)
{
   if (vec[i].condition) AppendToVec(vec);
}
Run Code Online (Sandbox Code Playgroud)

这样工作正常,事实上优雅地处理新附加元素递归需要添加更多元素的情况,但感觉有点脆弱.如果其他人出现并调整循环,它很容易被破坏.例如:

//No longer iterates over newly appended elements
vector<Foo>::size_type size = vec.size();
for (vector<Foo>::size_type i = 0; i < size; ++i)
{
   if (vec[i].condition) AppendToVec(vec);
}
Run Code Online (Sandbox Code Playgroud)

要么

//Vector resize may invalidate iterators
for (vector<Foo>::iterator i = vec.begin(); i != vec.end(); ++i)
{
   if (vec->condition) AppendToVec(vec);
}
Run Code Online (Sandbox Code Playgroud)

有没有最好的做法来处理这样的案件?用循环注释"警告:迭代时这个循环是故意附加到向量.谨慎改变"最好的方法?如果能让事情变得更加强大,我也愿意切换容器.

c++ stl

23
推荐指数
4
解决办法
1万
查看次数

在D中编译发布版本的代码

D(D2)中是否有任何机制强制在发布版本中编译出代码?

在C中,你可能有类似的东西

#ifndef NDEBUG
/*Something that will only run in a debug build*/
#endif
Run Code Online (Sandbox Code Playgroud)

我知道D有

debug(mymodule) {
   //Do something
}
Run Code Online (Sandbox Code Playgroud)

但这需要用户为每个模块传递-debug以启用它.

我正在寻找一种全局机制,它将始终在正常构建中运行代码,但在传递-release标志时将其编译出来.我知道一些内置函数具有这种能力(例如断言),但是用户代码有没有办法做到这一点?

d

7
推荐指数
1
解决办法
771
查看次数

标签 统计

build ×1

c++ ×1

cmake ×1

d ×1

gcc ×1

stl ×1