如何为 stat() 函数编写函数存根?
How can I write a function stub for stat() function?
我正在尝试为 中的函数 stat() 编写存根。
我能够使用以下代码为 fstat 成功执行此操作:
static int fstat_count;
static int fstat_fail_instance;
int my_fstat(const int fd, struct stat * st) {
fstat_count ++;
if (fstat_count == fstat_fail_instance) {
return EINVAL;
}
st->st_size = ST_SIZE;
return EOK;
}
#undef fstat
#define fstat my_fstat
当我尝试使用 stat 执行此操作时,出现如下错误:
mkqfs_file_test.c:28:20: error: storage size of ‘sb’ isn’t known
const struct stat sb;
我相信这是因为当我做
#undef stat
#define stat my_stat
就像我对 fstat 所做的那样,它取消定义了 struct stat 而不是函数。
知道如何解决这个问题,即只有 undefine/redefine 功能吗?
[...] I get errors like:
mkqfs_file_test.c:28:20: error: storage size of ‘sb’ isn’t known
const struct stat sb;
which i believe is because when I do the #undef stat
#define stat my_stat
like i do for fstat, it is undefining the struct stat not the
function.
不,#undef stat
不会取消定义任何函数或任何结构类型。它取消定义任何以前使用该名称定义的 预处理器宏 。因此,它可能是不必要的,最坏的情况下它是无害的。然而,在不太可能存在这样一个宏定义的情况下,符合规范的程序确实需要在重新定义它之前取消定义它。
问题出在 #define
上。如果 stat
宏的定义在您的结构声明出现的地方可见,那么它将在该标识符用作结构标记的地方展开。结果,这...
const struct stat sb;
...扩展为...
const struct my_stat sb;
。范围内没有可见类型 struct my_struct
的定义,因此不允许该声明。正如编译器所说,它不知道为 struct my_stat
提供多少 space,它也无法使用,因为编译器也不知道它的任何成员是什么。请注意,这不会阻止声明或使用指向 struct my_stat
的指针,但这有其自身的问题。
Any idea how I can resolve this, ie only undefine/redefine
function?
同样,您没有取消定义任何函数。由于 stat
在不同的名称 space 中用于相关目的,因此没有完全干净的方法来使用宏替换 my_stat()
代替 stat()
。您可以做三件主要的事情:
改用 function-like 宏:
#define stat(p,b) my_stat((p),(b))
在这种情况下,您必须确保不会尝试计算指向 stat
的指针。这可能是您最好的选择。
一并省略#undefine
和#define
,并将替换函数命名为stat()
,与原来的相同。这依赖于链接器选择您的 locally-defined 版本而不是库版本,它可能会这样做。但是,这可能会产生比您预期的更广泛的影响。
在#undefine
之前为struct stat
声明一个typedef
:
typedef struct stat struct_stat;
#undefine stat
#define stat my_stat
然后在您的宏定义可见的任何地方使用 typedef
而不是键入 struct stat
:
struct_stat sb;
我正在尝试为
static int fstat_count;
static int fstat_fail_instance;
int my_fstat(const int fd, struct stat * st) {
fstat_count ++;
if (fstat_count == fstat_fail_instance) {
return EINVAL;
}
st->st_size = ST_SIZE;
return EOK;
}
#undef fstat
#define fstat my_fstat
当我尝试使用 stat 执行此操作时,出现如下错误:
mkqfs_file_test.c:28:20: error: storage size of ‘sb’ isn’t known
const struct stat sb;
我相信这是因为当我做
#undef stat
#define stat my_stat
就像我对 fstat 所做的那样,它取消定义了 struct stat 而不是函数。
知道如何解决这个问题,即只有 undefine/redefine 功能吗?
[...] I get errors like:
mkqfs_file_test.c:28:20: error: storage size of ‘sb’ isn’t known const struct stat sb;
which i believe is because when I do the
#undef stat
#define stat my_stat
like i do for fstat, it is undefining the struct stat not the function.
不,#undef stat
不会取消定义任何函数或任何结构类型。它取消定义任何以前使用该名称定义的 预处理器宏 。因此,它可能是不必要的,最坏的情况下它是无害的。然而,在不太可能存在这样一个宏定义的情况下,符合规范的程序确实需要在重新定义它之前取消定义它。
问题出在 #define
上。如果 stat
宏的定义在您的结构声明出现的地方可见,那么它将在该标识符用作结构标记的地方展开。结果,这...
const struct stat sb;
...扩展为...
const struct my_stat sb;
。范围内没有可见类型 struct my_struct
的定义,因此不允许该声明。正如编译器所说,它不知道为 struct my_stat
提供多少 space,它也无法使用,因为编译器也不知道它的任何成员是什么。请注意,这不会阻止声明或使用指向 struct my_stat
的指针,但这有其自身的问题。
Any idea how I can resolve this, ie only undefine/redefine function?
同样,您没有取消定义任何函数。由于 stat
在不同的名称 space 中用于相关目的,因此没有完全干净的方法来使用宏替换 my_stat()
代替 stat()
。您可以做三件主要的事情:
改用 function-like 宏:
#define stat(p,b) my_stat((p),(b))
在这种情况下,您必须确保不会尝试计算指向
stat
的指针。这可能是您最好的选择。一并省略
#undefine
和#define
,并将替换函数命名为stat()
,与原来的相同。这依赖于链接器选择您的 locally-defined 版本而不是库版本,它可能会这样做。但是,这可能会产生比您预期的更广泛的影响。在
#undefine
之前为struct stat
声明一个typedef
:typedef struct stat struct_stat; #undefine stat #define stat my_stat
然后在您的宏定义可见的任何地方使用
typedef
而不是键入struct stat
:struct_stat sb;