неявное объявление getopt в Solaris?

В Solaris gcc дает мне

неявное объявление функции `getopt'

при компиляции

#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    getopt(1,argv,"");
    return 0;
} 

справочная страница для getopt говорит что-то о включении unistd.h или stdio.h, однако, хотя я включаю оба, я все равно получаю это предупреждение. Это нормально? Является ли использование функций, которые явно не объявлены, обычным явлением при разработке Unix?


person Steven    schedule 13.12.2009    source источник
comment
Я компилирую с помощью gcc -ansi -pedantic -Wall   -  person Steven    schedule 14.12.2009
comment
@Steven Что возвращает grep getopt /usr/include/*.h?   -  person Scooter    schedule 18.08.2012


Ответы (3)


Вы компилируете с -ansi, и в этом режиме getopt может быть недоступен, поскольку -ansi подразумевает режим, совместимый с C89. Попробуйте удалить этот переключатель или #define _GNU_SOURCE перед #include <unistd.h>. getopt() - это POSIX, а не ANSI.

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

#if _POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE || _POSIX_SOURCE

См. это для получения дополнительной информации о макросах тестирования функций.

person Alok Singhal    schedule 13.12.2009
comment
удаление -ansi действительно удаляет предупреждение. Однако мне интересно, почему getopt() не совместим с C89, когда все другие функции POSIX, которые я использовал, не давали никаких предупреждений, хотя #define _GNU_SOURCE этого не делает (это Solaris) - person Steven; 14.12.2009
comment
Смотрите мою правку. C89 не определяет getopt, поэтому было бы неправильно, если бы glibc выставлял его при компиляции в режиме C89. Хотя, поскольку он объявлен в unistd.h, которого нет в C89, возможно, glibc может это сделать, я не уверен. - person Alok Singhal; 14.12.2009

На странице руководства говорится, что нужно включать stdio.h, а не stdlib.h. Решает ли включение stdio.h проблему?

person sth    schedule 13.12.2009
comment
Вместо --ansi и при условии, что вы хотите четко указать стандарт, можно использовать -std=standard. Например: -std=gnu90 компилируется без каких-либо предупреждений и на данный момент является настройкой по умолчанию (когда -std опущен). - person Victor Farazdagi; 11.02.2013

Использование gnu99 решило это для меня:

gcc -std=gnu99 file.c

Это с unistd.h.

person KendallV    schedule 06.03.2013