2010-10-19 2 views
3

В следующем коде появляется предупреждение о наличии неявного объявления функции getpgid. Я знаю только его предупреждение, но его класс и профессор хотят, чтобы мы рассматривали предупреждения как ошибки. Итак, помогите пожалуйста.Неявная декларация функции в C UNIX

Я включил соответствующий файл заголовка, а поэтому я понятия не имею, что случилось:

#include <unistd.h> 

pid_t pid, pgid; 

if ((pgid = getpgid(pid)) < 0) { 
     app_error("Failure to get process group ID"); 
} 
+0

Какая платформа конкретно это? И, что это весь образец, или ваш код в действительной функции? – Joe

+0

http://bugs.php.net/bug.php?id=32045 имеет некоторые подсказки –

+0

Его код в действительной функции, я не включал полную функцию, так как это была единственная часть, которая вызывала проблемы, и ее UNIX. – DemonicImpact

ответ

4

От man page:

Требования макроса тестирования свойств для Glibc (см feature_test_macros(7)):

getpgid(): 
     _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED 
     || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L 
+0

Что это значит? Извините, я вроде как новичок в программировании ... ну, вроде. – DemonicImpact

+0

Что вы должны определить некоторые макросы для того, чтобы прототип был доступен вашему коду. См. Также справочную страницу (feature_test_macros (7)). – vanza

+0

Означает ли это, что мне нужно включить следующие строки перед моими заявлениями включения? #define _XOPEN_SOURCE #define _XOPEN_SOURCE_EXTENDED – DemonicImpact

0

Посмотреть в «getpgid» документации, если есть какой-то другой заголовок нужен

2

Лучшее предположение со всем разрешением: pid_t не определено. Вам нужны как

#include <sys/types.h> 
#include <unistd.h> 

В противном случае вы не получите то, что, по вашему мнению, получаете.

Было бы более полезным предоставить наименьший исходный файл, который не удалось таким же образом. Например, следующая (минимальная разработка вашего текста) не генерирует предупреждение, которое вы описываете для меня в первой системе, которую я пробовал.

#include <unistd.h> 
#include <stdio.h> 
int main() { 
    pid_t pid, pgid; 
    if((pgid = getpgid(pid)) < 0) { 
      puts("Oops."); 
    } 
    return 0; 
} 

Снижение причина минимального неудовлетворительную случае важно:
1. Обеспечивает, что вы адекватно изолировали проблему. Часто этот шаг делает очевидную причину. Это также помогает устранить ложные выводы.
2. Обеспечивает, чтобы другие могли воссоздать ваши трудности и тем самым диагностировать его.

Часто упражнение по подготовке объяснения проблемы к тому, кто не знаком с вашим проектом, заставляет источник проблемы выскочить.

+1

Нет, [' unistd.h'] (http://opengroup.org/onlinepubs/007908799/xsh/unistd.h.html) является гарантированно определит 'pid_t', и он получит другое предупреждение, если это не так. Но минимальный недостающий случай - это хороший общий совет. –

+0

Вы правы. Я снял The GNU C Library: Process Identification вместо того, чтобы нырять в unistd.h. –

+0

+1 для демонстрации того, что может выглядеть как минимум. Я не могу достаточно подчеркнуть, насколько мощным может быть эта техника, и насколько важно при попытке сообщить об ошибке. – RBerteig

1

Для таких ошибок, связанных с ОС/компилятором, вы должны предоставить нам дополнительную информацию о вашей платформе, вашем компиляторе и ваших флагов компилятора. Это не нормально, что ваша система имеет эту функцию и скрывает ее для вас. Вероятно, вам не хватает какого-либо флага компилятора.

В моем руководстве указано, что getpgid следует избегать, если это необходимо, и заменить на более простую функцию POSIX getpgrp(void). Если это вариант для вас (вы просто делаете это для идентификатора самого процесса), вы должны это сделать окончательно.

+0

Это перестало выдавать мне ошибку, когда я сделал то, что предложил верхний ответ, и добавил тестовый макрос ... Однако, я думаю, я могу использовать getpgrp, а может быть. – DemonicImpact

+1

@DemonicImpact: Конечно, решение, которое указано, является некоторым решением, чтобы обойти проблему. «Естественно», ваш компилятор должен знать, какая версия POSIX соответствует вашей системе, и делать то, что само по себе. –

Смежные вопросы