我正在尝试使用ftw函数来计算目录的大小。 ftw函数的原型是:
int ftw(const char *dirpath,
int (*fn) (const char *fpath, const struct stat *sb,
int typeflag),
int nopenfd);
要计算整个目录的大小,我尝试使用以下代码使用lambda表达式:
uint32_t calcDirSize(const char *path) {
uint32_t usize = 0;
if (ftw(path, [&usize](const char *fpath, const struct stat *sb, int typeflag) {
usize += sb->st_size;
return 0;
}, 1)) {
return 0;
}
return usize;
}
lambda表达式的capture子句中的变量抛出错误。我想使用局部变量来计算大小,并在计算后从calcDirSize函数返回。 还有其他方法可以达到相同的结果吗?
答案 0 :(得分:3)
lambda仅在无状态的情况下才可以转换为功能指针,换句话说,不能捕获任何东西。
仅允许在lambda之外的变量使用没有捕获的静态变量。
uint32_t calcDirSize(const char *path) {
static uint32_t usize = 0;
usize = 0; // Make sure it's reset to 0 every time the function is called.
if (ftw(path, [](const char *fpath, const struct stat *sb, int typeflag) {
usize += sb->st_size;
return 0;
}, 1)) {
return 0;
}
return usize;
}
通过将usize
设为静态,我们可以删除lambda中的捕获,并将其转换为函数指针。
编辑:正如评论中指出的那样,这不是线程安全的,因为多次调用calcDirSize
可以同时修改/读取usize
。