Найдите заголовочный файл, определяющий функцию C.
Вопрос
Не должно быть сложно, правда?Верно?
В настоящее время я просматриваю кодовую базу OpenAFS, чтобы найти определение заголовка pioctl.Я бросил на это все, что у меня было:проверил ctags, нашел исходный код pioctl и т. д.Ближе всего к зацепке у меня есть тот факт, что существует файл pioctl_nt.h, содержащий определение, но на самом деле это не то, что мне нужно, потому что ни один из кодов пользовательского пространства не включает его напрямую, и это специфично для Windows.
Я не жду, что вы пойдете, загрузите кодовую базу OpenAFS и найдете для меня заголовочный файл.Хотя мне интересно:Каковы ваши методы поиска нужного заголовочного файла, когда все остальное не удается?Каковы наихудшие сценарии, которые могут привести к тому, что grep для pioctl в базе кода фактически не выдаст ничего, похожего на определение функции?
Я также должен отметить, что у меня есть доступ к двум независимым программам пользовательского пространства, которые сделали это правильно, поэтому теоретически я мог бы выполнить поиск функции за O(n).Но ни один из заголовочных файлов мне не выскакивает, а n велико...
Редактировать: Насущная проблема решена:pioctl() определяется неявно, как показано ниже:
AFS.xs:2796: error: implicit declaration of function ‘pioctl’
Решение
Если grep -r
и ctags
не работают, то это, вероятно, определяется как результат некоторых неприятных макросов. Вы можете попробовать создать простейший из возможных файлов, который вызывает pioctl ()
и успешно компилируется, а затем предварительно обрабатывает его, чтобы увидеть, что происходит:
gcc -E test.c -o test.i
grep pioctl -C10 test.i
Другие советы
Существуют параметры компилятора для отображения вывода препроцессора.Попробуйте это?В ужасном случае, когда в моей голове совершенно не было никаких возможных определений, опция -E (в большинстве компиляторов C) ничего не делает, а просто выбрасывает предварительно обработанный код.
По запрошенной информации:Обычно я просто фиксирую компиляцию рассматриваемого файла, когда он выводится на экран, быстро копирую и вставляю и помещаю -E сразу после вызова компилятора.Результат выведет вывод препроцессора на экран, поэтому перенаправьте его в файл.Просмотрите этот файл, поскольку обо всех макросах и глупых вещах уже позаботились.
Худшие сценарии развития событий:
- Прототипы в стиле K&R
- Макросы скрывают определение
- Неявное объявление (согласно вашему ответу)
Рассматривали ли вы возможность использования cscope
(Доступна с ИсточникForge)?
Я с хорошим успехом использую его для некоторых довольно значительных наборов кода (более 25 000 файлов, длиной до 20 000 строк в файле).Получение списка файлов занимает некоторое время (5-10 минут) и больше (20-30 минут) для построения перекрестной ссылки на древнем Sun E450, но я считаю результаты полезными.
На почти столь же древнем Mac (два 32-разрядных процессора PPC с тактовой частотой 1 ГГц) cscope, запущенный в исходном коде OpenAFS (1.5.59), обнаруживает довольно много мест, где объявляется функция, иногда встроенная в код, иногда в заголовки. .Сканирование 4949 файлов заняло несколько минут, в результате чего был создан файл cscope.out размером 58 МБ.
- openafs-1.5.59/src/sys/sys_prototypes.h
- openafs-1.5.59/src/aklog/aklog_main.c (вместе с комментарием «Почему AFS не предоставляет эти прототипы?»)
- openafs-1.5.59/src/sys/pioctl_nt.h
- openafs-1.5.59/src/auth/ktc.c включает определение для PIOCTL
- openafs-1.5.59/src/sys/pioctl_nt.c предоставляет его реализацию.
- openafs-1.5.59/src/sys/rmtsysc.c предоставляет его реализацию (а иногда и afs_pioctl() вместо этого)
Остальные из 184 найденных экземпляров, похоже, представляют собой использование функции, ссылки на документацию, примечания к выпуску, журналы изменений и тому подобное.
Текущая рабочая теория, которую мы определили после того, как ковырялся в препроцессоре и ничего не нашел, заключается в том, что OpenAFS позволяет компилятору выводить прототип функции, так как он возвращает целое число и принимает указатель, целое число, указатель, целое число в качестве его параметров. Я буду иметь дело с этим, просто определяя это сам.
Изменить . Отлично! Я нашел дымящийся пистолет:
AFS.xs:2796: error: implicit declaration of function ‘pioctl’
Хотя на первоначальный общий вопрос был дан ответ, если кто-нибудь придет на эту страницу, задаваясь вопросом, где найти заголовочный файл, определяющий pioctl:
В текущих версиях OpenAFS (1.6.7) прототип pioctl определен в sys_prototypes.h. Но в то время, когда этот вопрос первоначально задавался, этот файл не существовал, и не было никакого прототипа для pioctl, видимого снаружи дерева кода OpenAFS.
Однако большинство пользователей pioctl, вероятно, хотят или, по крайней мере, согласны с использованием lpioctl (" local " pioctl), который всегда выдает системный вызов на локальном компьютере. Прототип для этого есть в afssyscalls.h (и в наши дни также sys_prototypes.h).
Однако в наши дни самым простым вариантом является использование libkopenafs. Для этого включите kopenafs.h, используйте функцию k_pioctl и создайте ссылку на -lkopenafs. Как правило, это гораздо более удобный интерфейс, чем попытка связать его с OpenAFS libsys и другими материалами.
Разве в резюме на справочной странице обычно не говорится?