簡體   English   中英

Lambda 的捕獲條款的問題

[英]Issue with Lambda's capture clause

我正在嘗試使用 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 表達式的捕獲子句中的變量拋出錯誤。 我想使用局部變量來計算大小並在計算后從 calcDirSize 函數返回。 有沒有其他方法可以達到相同的結果?

如果 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM