我正试图从<sys/stat.h>。我能够用以下代码成功地为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所做的那样,它是对结构stat而不是函数进行定义。知道我如何解决这个问题吗?
[…]我得到的错误如下:
mkqfs_file_test.c:28:20: error: storage size of ‘sb’ isn’t known const struct stat sb;
我相信这是因为当我像对待fstat那样处理
#undef stat
#define stat my_stat
时,它是在定义结构stat,而不是作用
否,#undef stat
不定义任何函数或任何结构类型。它用该名称取消定义预处理器宏的任何先前定义。因此,这可能是不必要的,最坏的情况是无害的。然而,在不太可能的情况下,存在这样一个现有的宏定义,一个符合要求的程序在重新定义它之前确实需要取消定义
问题出在#define
上。如果stat
宏的定义在结构声明出现的位置可见,那么它将在该标识符用作结构标记的位置展开。因此,这。。。
const struct stat sb;
。。。扩展到。。。
const struct my_stat sb;
由于作用域中没有可见类型struct my_struct
的定义,因此不允许使用该声明。正如编译器所说,它不知道为struct my_stat
提供多少空间,也不知道它是否可用,因为编译器也不知道其任何成员是什么。请注意,这并不妨碍声明或使用指向struct my_stat
的指针,但这也有其自身的问题。
任何我可以解决这个问题的想法,即只定义/重新定义作用
同样,您没有对任何函数进行定义。由于stat
在不同的命名空间中用于相关目的,因此没有完全干净的方法可以使用宏来用my_stat()
代替stat()
。你可以做三件主要的事情:
使用类似宏的函数:
#define stat(p,b) my_stat((p),(b))
在这种情况下,必须确保不会尝试计算指向
stat
的指针。这可能是你最好的选择。完全省略
#undefine
和#define
,并将替换函数命名为stat()
,与原始函数相同。这依赖于链接器来选择本地定义的版本,而不是库版本,它可能会这样做。然而,这可能会产生比预期更大的影响。在
#undefine
之前,为struct stat
:声明一个typedef
typedef struct stat struct_stat; #undefine stat #define stat my_stat
然后在宏定义可见的任何地方使用
typedef
而不是键入struct stat
:struct_stat sb;