导入 unistd.h 后,编译器声明 sbrk() 是隐式声明。为什么是这样?
After importing unistd.h, compiler states that sbrk() is an implicit declaration. Why is this?
我正在尝试在 CentOS 上实施 malloc
,但我一直收到错误消息:
malloc.c: In function ‘malloc’:
malloc.c:11:5: error: implicit declaration of function ‘sbrk’ [-Werror=implicit-function-declaration]
mem_ptr = sbrk(SIXTY_FOUR_K); /* Allocate 64 kB of memory */
编译器警告引用的代码如下:
#include "malloc.h"
#include <unistd.h>
void * malloc(size_t bytes) {
uintptr_t mem_ptr;
if (bytes <= 0) { /* If user passes in bad value, return NULL */
return NULL;
}
mem_ptr = sbrk(SIXTY_FOUR_K); /* Allocate 64 kB of memory */
if (mem_ptr == -1) { /* sbrk() failed */
return NULL;
}
return (void *)mem_ptr;
}
根据 sbrk
上的文档,您应该只需导入 unistd.h
,我就是这样做的。我做错了什么吗?
您查看功能测试宏要求了吗?
Feature Test Macro Requirements for glibc (see
feature_test_macros(7)):
brk(), sbrk():
Since glibc 2.12:
_BSD_SOURCE || _SVID_SOURCE ||
(_XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) &&
!(_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600)
Before glibc 2.12:
_BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
看看用 -D_SVID_SOURCE
之类的东西编译是否可行(尽管看起来有许多基于该宏列表的选项)
从 glibc 2.19 开始,添加了一个新的功能测试宏,_DEFAULT_SOURCE
,旨在取代 _BSD_SOURCE
和 _SVID_SOURCE
。有关 _DEFAULT_SOURCE
的更多信息,请参阅此问题:
我正在尝试在 CentOS 上实施 malloc
,但我一直收到错误消息:
malloc.c: In function ‘malloc’:
malloc.c:11:5: error: implicit declaration of function ‘sbrk’ [-Werror=implicit-function-declaration]
mem_ptr = sbrk(SIXTY_FOUR_K); /* Allocate 64 kB of memory */
编译器警告引用的代码如下:
#include "malloc.h"
#include <unistd.h>
void * malloc(size_t bytes) {
uintptr_t mem_ptr;
if (bytes <= 0) { /* If user passes in bad value, return NULL */
return NULL;
}
mem_ptr = sbrk(SIXTY_FOUR_K); /* Allocate 64 kB of memory */
if (mem_ptr == -1) { /* sbrk() failed */
return NULL;
}
return (void *)mem_ptr;
}
根据 sbrk
上的文档,您应该只需导入 unistd.h
,我就是这样做的。我做错了什么吗?
您查看功能测试宏要求了吗?
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
brk(), sbrk(): Since glibc 2.12: _BSD_SOURCE || _SVID_SOURCE || (_XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) && !(_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) Before glibc 2.12: _BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
看看用 -D_SVID_SOURCE
之类的东西编译是否可行(尽管看起来有许多基于该宏列表的选项)
从 glibc 2.19 开始,添加了一个新的功能测试宏,_DEFAULT_SOURCE
,旨在取代 _BSD_SOURCE
和 _SVID_SOURCE
。有关 _DEFAULT_SOURCE
的更多信息,请参阅此问题: