Создание объявлений функций на основе определений функций - PullRequest
1 голос
/ 05 июня 2010

Я написал файл .cpp с несколькими функциями, и теперь мне нужно объявить их в заголовочном файле. Мне пришло в голову, что я могу найти файл для имени класса и получить объявления таким образом, и он бы работал достаточно хорошо, если бы у меня было полное объявление функции до определения - код возврата, имя и параметры (но не тело функции) - было в одной строке.

Мне кажется, что это то, что в целом было бы полезно, и, должно быть, было решено несколько раз. Я рад редактировать вывод и не беспокоиться о крайних случаях; все, что дает мне правильные результаты в 95% случаев, было бы замечательно.

Итак, если, например, мой файл .cpp имел:

i2cstatus_t NXTI2CDevice::writeRegisters(
    uint8_t  start_register,    // start of the register range
    uint8_t  bytes_to_write,    // number of bytes to write
    uint8_t* buffer = 0)        // optional user-supplied buffer
{
...
}

и ряд других похожих функций, возвращающих это:

i2cstatus_t NXTI2CDevice::writeRegisters(
        uint8_t  start_register,    // start of the register range
        uint8_t  bytes_to_write,    // number of bytes to write
        uint8_t* buffer = 0)

для включения в заголовочный файл, после небольшого редактирования, все будет в порядке.

Получение этого обратно:

i2cstatus_t writeRegisters(
        uint8_t  start_register,    
        uint8_t  bytes_to_write,    
        uint8_t* buffer);

или это:

i2cstatus_t writeRegisters(uint8_t  start_register, uint8_t  bytes_to_write, uint8_t* buffer);

было бы еще лучше.

Ответы [ 2 ]

4 голосов
/ 05 июня 2010

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

Начните с заголовочных файлов. Затем, если хотите, создайте тела реализации-заглушки и, возможно, обертки для тестовых примеров, а затем начните заполнять функции. Сборка, тестирование, исправление, расширение, кожа, повтор.

Edit:

Разговор, который не вписывается в комментарий:

Тогда мой вопрос - если это не «публичный интерфейс», зачем он вам нужен в шапке? Я твердо убежден, что все, что содержит заголовочный файл, - это интерфейс , независимо от того, насколько мала и какая внутренняя / внешняя подсистема подвергает его воздействию какой-либо другой части. Это не кажется значительным для одного парня проекта. Но рано или поздно второй паре глаз (вероятно, даже вашим собственным, через три или шесть месяцев) придется снова пройти через этот интерфейс и выяснить, почему он был обнародован, о чем думал автор, какова цель и т. д. и т. д.

Trivial? Да! Но я не могу сказать вам, сколько раз я проклинал первоначального автора (включая меня) некоторый код, который мне пришлось читать и понимать (снова), и это тривиальное эмпирическое правило спасло бы меня так много волос:)

Редактировать 2:

... как объявить приватную функцию-член без объявления ее с остальным классом в заголовке?

Это известная ошибка самого C ++. См., Например, статью (в основном) приватной Саттера. Есть несколько способов справиться с этим на уровне проектирования:

  • В C ++ не все должно быть классом, бесплатные функции великолепны. Объявите и используйте указатель на функцию, реализуйте набор соответствующих функций в файле .cpp, поместите указатели в таблицу или контейнер STL.
  • Вперед объявлять класс, так что непрозрачно для пользователя, изменить интерфейс для работы с ссылкой или указателем.
  • Используйте идиому pimpl (также здесь )
1 голос
/ 06 июня 2010

Я скомпилировал exuberant ctags версия 5.8.Эта команда дает мне то, что я хочу:

/usr/local/bin/ctags -x --c-kinds=f $SOURCE |
awk -v OFS=" " '$1=$1' |
cut -d " " -f 5- |
sed -e 's/[A-Za-z]*:://g' |
sed -e 's/)$/);/'

, где вы заменяете имя файла, которое вас интересует, вместо $ SOURCE.

Обратите внимание, что команда ctags сама по себе дает приемлемый вывод, и вы можете добавить флаг -u, если хотите выводить в том порядке, в каком он отображается в файле, а не в алфавитном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...