После импорта unistd.h компилятор утверждает, что sbrk () является неявным объявлением.Почему это? - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь реализовать malloc в CentOS, но получаю сообщение об ошибке:

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, что я и делаю.Что-то я делаю не так?

1 Ответ

0 голосов
/ 03 октября 2018

Вы ознакомились с требованиями макроса функционального теста?

Требования макроса функционального теста для glibc (см. 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 см. Этот вопрос: Что делает -D_DEFAULT_SOURCE?

...