在使用gcc构建时,CMake中是否有任何方法强制通过include_directories(或者可能通过不同的函数)指定的路径使用-isystem标志而不是-I标志?
有关-I和-isystem的详细信息,请参阅http://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html#Directory-Options.
我有一个迭代的矢量.在迭代时,我可能会向向量添加新值.它看起来像:
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)
有没有最好的做法来处理这样的案件?用循环注释"警告:迭代时这个循环是故意附加到向量.谨慎改变"最好的方法?如果能让事情变得更加强大,我也愿意切换容器.
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标志时将其编译出来.我知道一些内置函数具有这种能力(例如断言),但是用户代码有没有办法做到这一点?