簡體   English   中英

沖突的函數聲明和宏?

[英]Conflicting function declaration and macro?

我在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中定義的函數?

函數聲明和宏沒有沖突。 memcpy()具有在內核,其在通過上述的注釋暗示幾種定義#undef塊-有另一個memcpy()中所定義string_32.h

#undef memcpy正在取消string_32.h中找到的#define ,這樣它就不會存在於包含/boot/string.h的任何文件中。 然后聲明memcpy() ,並為它構建一個新的宏。

#define語句正在為memcpy()創建一個新的宏,因為string_32.h中的一個不再存在於此上下文中。 內核開發人員出於各種原因使用宏; 請參閱此主題中的答案以獲取更多信

/boot/copy.S是一個程序集文件 你可以在這里閱讀一下它的作用。 /boot/main.c中使用的memcpy()來自/boot/string.h - 檢查include語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM