我们正在使用clang -fmodule和-fcxx-module启用模块支持,如http://clang.llvm.org/docs/Modules.html中所述.通过为我们的核心库定义模块映射,我们已经看到了构建时间的显着改进.
但是,我们有一些库头文件使用编译指示来禁用某些行的警告,例如:
template <typename TFloat>
static bool exactlyEqual(TFloat lhs, TFloat rhs)
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wfloat-equal"
return lhs == rhs;
#pragma clang diagnostic pop
}
Run Code Online (Sandbox Code Playgroud)
当这头拉在为预编译的模块,它似乎铿锵的内部表示不保留编译信息和警告仍然发出.由于我们将警告视为错误,因此导致编译失败.有些人可能会争辩说float-equal完全禁用,但我们还有其他一些具有不同警告的情况,我们不希望全局禁用.
我们已经在使用-Wno-system-headers,-isystem所以图书馆的客户端通常不会看到这样的警告(即使没有编译指示),但是当标头作为模块导入时,这似乎不起作用.此外,我们仍然会对库内部的代码发出这些警告,其中包含标头作为非系统标头(即不使用-isystem/使用双引号),因为模块预编译和导入也发生在这里.
我尝试使用_Pragma(...)而不是#pragma没有任何影响.
是否有其他方法有条件地忽略来自预编译的clang模块的标题中的警告?
更新:我已经把一个样本项目多达上https://github.com/MikeWeller/ClangModuleWarnings其重现问题
更新:似乎[system]模块属性将禁止所有警告.然而,这甚至会抑制我们在构建库本身时想要看到的警告,并且我们不希望制作所有模块系统模块.如果我们在构建库本身时找到了不使用库模块映射的方法,这可能是可以接受的,但我们仍然希望对非系统模块进行某些警告.
假设我有一个带有setter的简单类:
class MyClass
{
public:
void setName(std::string name)
{
_name = std::move(name);
}
private:
std::string _name;
};
Run Code Online (Sandbox Code Playgroud)
我在std::move这里使用,但是如果我要省略这个并且只是写_name = name,那么编译器是否会隐式移动name参数,因为它不会在setter中的任何其他地方使用?它几乎可以被视为赋值表达式中的右值,因为它在其他任何地方都没有被名称引用.
编译器可以这样做吗?现有的编译器会这样做吗?
我有一个由 NSFetchedResultsController 支持的 UITableView,它可以随时触发更新。如果用户当前正在重新排序行,应用这些更新将导致异常,因为表视图已临时接管,您会收到类似的错误
Invalid update: invalid number of rows in section [...]
Run Code Online (Sandbox Code Playgroud)
如何检测用户何时开始移动单元格,以便延迟由获取的结果控制器引起的更新?似乎没有任何表视图委托方法来检测这一点。这个委托方法:
- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath {
Run Code Online (Sandbox Code Playgroud)
当用户最初分离第一个单元格时不会被调用,只有当他们实际将它移动到其他地方时才会调用。
一种解决方案是检查isEditing获取的结果回调并只执行批量操作reloadData而不是动态插入/删除行,但我想知道是否有一种方法可以专门检查“重新排序”模式。
除了以下代码之外,还有哪些替代方案可以对对象执行安全的异步回调?
class MyClass : public std::enable_shared_from_this<MyClass>
{
private:
void fetchResults()
{
std::weak_ptr<MyClass> weakSelf = shared_from_this();
m_service.getResultAsync(
/* args... */,
/* Callback */
[weakSelf](Result r)
{
auto self = weakSelf.lock();
if (self)
{
self->workFinishedWithResult(std::move(r));
}
});
}
void workFinishedWithResult(Result r) { // ... continue workflow }
std::shared_ptr<Service> m_service;
};
Run Code Online (Sandbox Code Playgroud)
我想避免使用enable_shared_from_this(并避免客户m_service在非常常见的用例中需要它),但如果没有它,似乎很难延长MyClass回调中的一次的生命周期。
相反,在 lambda 中捕获this并尝试在 MyClass 的析构函数中取消注册它,或者阻止 MyClass 在回调完成之前被破坏,会导致竞争、死锁和失去简单性。我几乎可以肯定捕捉“这个”并不安全。
看来,如果 MyClass 要求 ashared_ptr<Service>回调它,它只能保证它保持有效,如果它可以管理或延长自己的生命周期(通过enable_shared_from_this),因为它不知道回调将持续多久。否则,无论谁拥有 ,或者谁知道 和 的生命周期,都必须有责任来MyClass处理这个问题,但这一切都变得非常容易出错且不切实际。ServiceMyClass
看来唯一可行的解决方案是: …
我正在尝试创建一个NSPredicate来查找在某个日期范围内包含"会话"的"项目".我一开始尝试了这个:
[NSPredicate predicateWithFormat:@"ANY sessions.date BETWEEN {$STARTDATE, $ENDDATE}"];
Run Code Online (Sandbox Code Playgroud)
但我得到一个例外:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
'to-many key not allowed here'
Run Code Online (Sandbox Code Playgroud)
似乎BETWEEN不能以这种方式与ANY一起使用.我也限制使用()和AND子句,这意味着我不能使用类似的东西:
[NSPredicate predicateWithFormat:@"ANY (sessions.date > $STARTDATE && sessions.date < $ENDDATE)"];
Run Code Online (Sandbox Code Playgroud)
如果我尝试,我得到一个解析错误.当然,sessions.date实际上是一个集合,因此并非如此并不是很有意义.
我怎样才能做到这一点?
谢谢
更新:请注意:
[NSPredicate predicateWithFormat:@"ANY sessions.date > $STARTDATE && ANY sessions.date < $ENDDATE"];
Run Code Online (Sandbox Code Playgroud)
是不正确的,因为它返回的项目的会话大于开始日期,而另一个会话小于结束日期,但两者之间没有会话.
处理帮助表的最佳方法是什么(我认为这是一个更具技术性的词,但它现在正在逃避我)?例如,我的名为Entity的对象具有entity_type属性.该entity_type需要一个字符串描述.我们假设只有少数entity_types可能.
所以我可以看到一些方法:
拥有另一个Core Data实体对象名称Entity_Type并将其连接到多个,以便我可以轻松获取描述.例如,这将允许我轻松地在UIPickerView中使用.
我还可以看到为什么#1是一个陷阱,因为稍后我需要做一些像switch/case这样的事情来处理每种类型的特定功能.作为一个核心数据对象,我没有说"id"来执行switch语句.替代方案是硬编码枚举,但那我将如何处理描述?
也许是两者的结合?
任何有类似情况的建议或经验都会有很大帮助.我试过搜索,但我所有出现的是如何找到CD对象的ID,这是无关紧要的.
我创建了两个文件,其中第二个文件应该打印一个std :: vector.
那是我的main.cpp:
#include <vector>
int main() {
std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
那是print.cpp
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
template <typename T> void printVec(T vec) {
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
}
template void printVec< std::vector<int> >(std::vector<int> t);
Run Code Online (Sandbox Code Playgroud)
我编译了这些文件:
g++ -g main.cpp -o main.o
g++ -g -c print.cpp -o print.o
g++ -o main main.o print.o
Run Code Online (Sandbox Code Playgroud)
并得到以下错误
main.o: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o:(.text+0x0): first defined …Run Code Online (Sandbox Code Playgroud) c++ ×4
iphone ×3
c++11 ×2
core-data ×2
ios ×2
asynchronous ×1
callback ×1
clang ×1
clang++ ×1
gcc ×1
llvm-clang ×1
nspredicate ×1
objective-c ×1
uitableview ×1