Неявное объявление функции в C UNIX

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

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

#include <unistd.h>

pid_t pid, pgid;

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

person DemonicImpact    schedule 19.10.2010    source источник
comment
На какой конкретно платформе это? И это весь пример, или ваш код внутри реальной функции?   -  person Joe    schedule 19.10.2010
comment
bugs.php.net/bug.php?id=32045 содержит некоторые подсказки   -  person Preet Sangha    schedule 19.10.2010
comment
Его код в реальной функции, я не включил полную функцию, так как это была единственная часть, которая вызывала проблемы, и это было в UNIX.   -  person DemonicImpact    schedule 19.10.2010
comment
Ваш профессор не одинок. Мы рассматриваем предупреждения как ошибки в нашей системе сборки. I обычно является хорошей практикой, к которой можно привыкнуть, особенно если вы не понимаете предупреждения, как в данном случае.   -  person Ed S.    schedule 19.10.2010


Ответы (4)


На справочной странице:

Требования к макросам тестирования функций для glibc (см. feature_test_macros(7)):

getpgid():
      _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
      || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
person vanza    schedule 19.10.2010
comment
Что это значит? Извините, я новичок в программировании... ну, вроде того. - person DemonicImpact; 19.10.2010
comment
Что вам нужно определить некоторые макросы, чтобы прототип был доступен для вашего кода. Также см. указанную справочную страницу (feature_test_macros(7)). - person vanza; 19.10.2010
comment
Означает ли это, что мне нужно включить следующие строки перед моими операторами включения? #define _XOPEN_SOURCE #define _XOPEN_SOURCE_EXTENDED - person DemonicImpact; 19.10.2010
comment
@DemonicImpact: #define _XOPEN_SOURCE 500 - person caf; 19.10.2010

Лучшее предположение со всеми исключениями: 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. Гарантирует, что другие смогут воссоздать вашу проблему и тем самым диагностировать ее.

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

person Eric Towers    schedule 19.10.2010
comment
Нет, unistd.h гарантированно определяет pid_t, и он получит другое предупреждение, если бы это было не так. Но случай минимального отказа — хороший общий совет. - person Matthew Flaschen; 19.10.2010
comment
Ты прав. Я просмотрел ‹a href=delorie.com/gnu/docs/glibc/ libc_566.html›Библиотека GNU C: идентификация процессов‹/a› вместо погружения в unistd.h. - person Eric Towers; 19.10.2010
comment
+1 за демонстрацию того, как может выглядеть минимальный тестовый пример. Я не могу не подчеркнуть, насколько мощной может быть эта техника и насколько она важна при попытке сообщить об ошибке. - person RBerteig; 19.10.2010

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

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

person Jens Gustedt    schedule 19.10.2010
comment
Он перестал выдавать мне ошибку, когда я сделал то, что предложил верхний ответ, и добавил тестовый макрос ... Однако я думаю, что вместо этого я могу использовать getpgrp. - person DemonicImpact; 19.10.2010
comment
@DemonicImpact: конечно, указанное решение является своего рода решением, позволяющим обойти проблему. Естественно, ваш компилятор должен знать, какой версии POSIX соответствует ваша система, и сам поступать правильно. - person Jens Gustedt; 19.10.2010

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

person ariel    schedule 19.10.2010