函数声明和宏冲突?

时间:2018-12-15 22:54:53

标签: c linux-kernel

我正在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?

中定义的函数

1 个答案:

答案 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语句。