получение "неявного объявления функции 'fcloseall' недопустимо в C99" при компиляции в gnu99 - PullRequest
5 голосов
/ 13 января 2011

Рассмотрим следующий код C:

#include <stdio.h>
#include <stdlib.h>

void fatal(const char* message){
 /*
  Prints a message and terminates the program.
  Closes all open i/o streams before exiting.
 */
 printf("%s\n", message);
 fcloseall();
 exit(EXIT_FAILURE);
}

Я использую Clang 2.8 для компиляции: clang -Wall -std=gnu99 -o <executable> <source.c>

И получите: implicit declaration of function 'fcloseall' is invalid in C99

Что верно, но я явно собираю gnu99 [который должен поддерживать fcloseall ()], а не c99 Несмотря на то, что код работает, мне не нравятся неразрешенные предупреждения при компиляции. Как я могу решить это?

Редактировать : исправлено типо.

Ответы [ 2 ]

4 голосов
/ 13 января 2011

Чтобы включить нестандартные расширения, когда вы включаете стандартные заголовки, вам нужно определить соответствующий макрос тестирования функции. В этом случае _GNU_SOURCE должно работать.

#define _GNU_SOURCE
#include <stdio.h>

Это не зависит от -std=gnu99, который включает расширения языка, а не расширения библиотеки.

1 голос
/ 26 января 2017

Здесь на странице man из fcloseall()

#define _GNU_SOURCE 
#include <stdio.h>

Вы должны определить макросы _GNU_SOURCE - это ваш фрагмент вместе с заголовком stdio.h. _GNU_SOURCE - это макрос тестирования функций, который используется для создания переносимого приложения.

...