Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 函数声明和宏冲突?_C_Linux Kernel - Fatal编程技术网

C 函数声明和宏冲突?

C 函数声明和宏冲突?,c,linux-kernel,C,Linux Kernel,我正在linux内核中查看此头文件: 我搞不清楚#unde+函数声明+宏在memcpy、memset和memcmp上定义了什么。例如,它首先声明一个函数memcpy,然后定义一个宏memcpy。我不知道这样做的目的是什么。我发现此函数在此处定义:。如果代码中的某个地方使用memcpy(例如这里:)使用memcpy它使用什么?copy.S或uu builtin\u memcpy中定义的函数函数声明和宏不冲突memcpy()在内核中有几个定义,在#unde块上方的注释中可以看出这一点——在中定义了

我正在linux内核中查看此头文件:


我搞不清楚#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 */