我正在Linux内核中查看此头文件: https://elixir.bootlin.com/linux/v4.14/source/arch/x86/boot/string.h
#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 */
我不知道#undef +函数声明+宏在memcpy,memset和memcmp上定义了什么。例如,它首先声明一个函数memcpy,然后在其后定义一个宏memcpy。我不确定这样做的目的是什么。我发现此功能在这里定义:https://elixir.bootlin.com/linux/v4.14/source/arch/x86/boot/copy.S#L20。如果代码中的某处使用了memcpy(例如:https://elixir.bootlin.com/linux/v4.14/source/arch/x86/boot/main.c#L40)使用了memcpy,它有什么用?在copy.S或__builtin_memcpy?
中定义的函数答案 0 :(得分:0)
函数声明和宏没有冲突。 memcpy()
在内核中有几个定义,在#undef
块上方的注释中得到了提示-string_32.h中定义了另一个memcpy()
。
#undef memcpy
取消了在 string_32.h 中找到的#define
,因此它在包含 /boot/string.h <的任何文件中都不存在。 / em>。然后声明memcpy()
,并为其创建一个新的宏。
#define
语句正在为memcpy()
创建一个新的宏,因为 string_32.h 中的那个不再存在。内核开发人员出于各种原因使用宏。有关更多信息,请参见this thread。
/boot/copy.S 是assembly file。您可以阅读有关其角色here的内容。 /boot/main.c 中使用的memcpy()
来自 /boot/string.h -检查include语句。