定义递归值C

定义递归值C,c,macros,C,Macros,用法 这是我试图理解的代码片段,我不知道这个定义是如何工作的。 它是递归的吗? 有人能一步一步地解释一下lseek中发生了什么吗?第一个是带有一个参数的宏。当预处理器看到块偏移量(…)时,它将被(基本块偏移量+(…-1)*块大小) 第二个是宏的用法,如上所述: 预处理前: #define BLOCK_OFFSET(block) (BASE_OFFSET+(block-1)*block_size) lseek(fd, BLOCK_OFFSET(group->bg_inode_table)+

用法

这是我试图理解的代码片段,我不知道这个定义是如何工作的。 它是递归的吗?
有人能一步一步地解释一下lseek中发生了什么吗?

第一个是带有一个参数的宏。当预处理器看到
块偏移量(…)
时,它将被
(基本块偏移量+(…-1)*块大小)

第二个是宏的用法,如上所述:

预处理前:

#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);
预处理后:

#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);

如果您使用gcc,您可以使用
gcc-E file.c
仅预处理该文件,然后查看该文件并验证预处理器所做的操作。

您认为什么是递归定义的?BLOCK_OFFSET和BASE_OFFSET不是一回事,我在lseek(2)中也看不到任何自参考。define只是将BLOCK_OFFSET(foobar)替换为(BASE_OFFSET+(foobar-1)*BLOCK_size)。简化表达式的编写很有用,但它不是递归的。您能解释一下如何删除定义并编辑lseek使其工作吗?我只是想知道它到底做什么你可以手动做。找到块偏移量(任意值)时,将其替换为(基本块偏移量+(任意值-1)*块大小)。当然,必须在某个地方定义块大小以及基偏移。后者可能在某些地方。不过,块大小可能是一个变量。但是为什么要删除这个定义呢?
lseek(fd, (BASE_OFFSET+(group->bg_inode_table-1)*block_size)+(inode_no-1)*sizeof(struct ext2_inode),SEEK_SET);