C 函数声明和宏冲突?
我正在linux内核中查看此头文件:C 函数声明和宏冲突?,c,linux-kernel,C,Linux Kernel,我正在linux内核中查看此头文件: 我搞不清楚#unde+函数声明+宏在memcpy、memset和memcmp上定义了什么。例如,它首先声明一个函数memcpy,然后定义一个宏memcpy。我不知道这样做的目的是什么。我发现此函数在此处定义:。如果代码中的某个地方使用memcpy(例如这里:)使用memcpy它使用什么?copy.S或uu builtin\u memcpy中定义的函数函数声明和宏不冲突memcpy()在内核中有几个定义,在#unde块上方的注释中可以看出这一点——在中定义了
我搞不清楚#unde+函数声明+宏在memcpy、memset和memcmp上定义了什么。例如,它首先声明一个函数memcpy,然后定义一个宏memcpy。我不知道这样做的目的是什么。我发现此函数在此处定义:。如果代码中的某个地方使用memcpy(例如这里:)使用memcpy它使用什么?copy.S或uu builtin\u memcpy中定义的函数函数声明和宏不冲突
memcpy()
在内核中有几个定义,在#unde
块上方的注释中可以看出这一点——在中定义了另一个memcpy()
#undef memcpy
正在取消在string_32.h中找到的#define
,这样它就不会存在于包含/boot/string.h的任何文件中<然后声明code>memcpy(),并为其构建一个新宏
#define
语句正在为memcpy()
创建一个新宏,因为string_32.h中的宏在此上下文中不再存在。内核开发人员出于各种原因使用宏;有关更多信息,请参见中的答案
/boot/copy.S是一个。你可以读一些关于它的角色。在/boot/main.c中使用的
memcpy()
来自/boot/string.h——请检查include语句。声明的目的可能是,当您说它来自/boot/string时,如果人们绕过以下宏(例如,取消定义它们),它仍然有效。h您是指内置的memcpy吗?我的假设是,它最终会使用副本中的一个。这就是为什么在同一个模块中会有这样的定义。\u builtin\u memcpy(d,S,l)
是memcpy(d,S,l)
的宏,这意味着它们的计算结果是相同的:定义void*memcpy(void*dst,const void*src,size\t len)代码>。由于您实际上没有看到在链接到的/boot/main.c中的行上调用\uu内置的memcpy()
,因此可以安全地假设您正在直接调用memcpy()
。copy.S中的memcpy
版本是由汇编程序使用的,而不是在/boot/main.c中,这在我链接到的一篇文章中进行了讨论。
#ifndef BOOT_STRING_H
#define BOOT_STRING_H
/* Undef any of these macros coming from string_32.h. */
#undef memcpy
#undef memset
#undef memcmp
void *memcpy(void *dst, const void *src, size_t len);
void *memset(void *dst, int c, size_t len);
int memcmp(const void *s1, const void *s2, size_t len);
#define memcpy(d,s,l) __builtin_memcpy(d,s,l)
#define memset(d,c,l) __builtin_memset(d,c,l)
#define memcmp __builtin_memcmp
...
#endif /* BOOT_STRING_H */