2015-06-20 52 views
-3
#define BLOCK_OFFSET(block) (BASE_OFFSET+(block-1)*block_size) 

使用遞歸定義值c

 lseek(fd, BLOCK_OFFSET(group->bg_inode_table)+(inode_no-1)*sizeof(struct ext2_inode),SEEK_SET); 

這是一個代碼我嘗試瞭解的片段,我不知道該怎麼定義的作品。 它是遞歸嗎? 有人可以解釋一步一步怎麼樣發生在lseek?

+3

你在想什麼是遞歸定義的? BLOCK_OFFSET和BASE_OFFSET不是一回事,我也沒有在lseek(2)中看到任何自引用。 – dho

+0

該定義只是用(BASE_OFFSET +(foobar-1)* block_size)替換BLOCK_OFFSET(foobar)。簡化表達式的寫法是有用的,但它不是遞歸的。 – LSerni

+0

你能解釋我該如何刪除定義並編輯lseek,以便它能正常工作?我只想知道它到底是什麼 – Timur

回答

1

第一個是有一個參數的宏。當預處理器看到BLOCK_OFFSET(...)則其由(BASE_OFFSET+(...-1)*block_size)

#define BLOCK_OFFSET(block) (BASE_OFFSET+(block-1)*block_size) 

第二置換是宏的使用如上所述:

預處理之前:

lseek(fd, BLOCK_OFFSET(group->bg_inode_table)+(inode_no-1)*sizeof(struct ext2_inode),SEEK_SET); 

預後 - 處理:

lseek(fd, (BASE_OFFSET+(group->bg_inode_table-1)*block_size)+(inode_no-1)*sizeof(struct ext2_inode),SEEK_SET); 

如果你使用gcc你可以使用gcc -E file.c僅對文件進行預處理,然後您可以查看該文件並驗證預處理器的功能。