Правильная компоновка заголовочного файла C ++ - PullRequest
1 голос
/ 02 декабря 2009

Каков правильный формат файла C ++ .h?

То, что я имею в виду, это защита заголовка, включает в себя: определения типов, перечисления, структуры, объявления функций, определения классов, классы, шаблоны и т. Д. И т. Д.

Я портирую старую кодовую базу, которой более 10 лет, и переход на современный компилятор из Codewarrior 8 оказывается интересным, поскольку вещи кажутся повсюду. Я получаю много не назвать ошибки типа, запрещая декларировать без типа и т. Д., И т. Д.

Ответы [ 4 ]

3 голосов
/ 02 декабря 2009

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

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

Правило, которое я соблюдаю для C ++ - это один заголовок на класс, который обычно сохраняет заголовки достаточно маленькими, чтобы можно было захватывать контент и находить вещи без особой прокрутки.

1 голос
/ 02 декабря 2009

Похоже, вы сталкиваетесь с предположениями, сделанными на основе предыдущей реализации (Codewarrior). Например:

#include <iostream>
int main() {
  std::cout << "string literal\n";
  return 0;
}

Это зависит от iostream, в том числе от того, что не требуется объявлять: перегрузка operator<<(ostream&, char const*) (это бесплатная функция, а не метод ostream, как другие). И чтобы быть полностью однозначным, #include <ostream> также требуется выше. В C ++ в библиотечные заголовки разрешено включать любой другой библиотечный заголовок, так что эта проблема возникает всякий раз, когда кто-то непреднамеренно зависит от этого.

(То, что дополнительный заголовок требуется в этом конкретном случае, считается недостатком для многих, включая меня, и почти все реализации предоставляют объявление этой функции в iostream. Это все еще самый короткий, распространенный пример, который я знаю для проиллюстрируйте это.)

Это часто более тонкий и сложный, чем этот простой пример, но основная проблема та же. Решение состоит в том, чтобы проверить каждый заголовок, чтобы убедиться, что он включает в себя все библиотеки, которые ему требуются , начиная с тех, которые дают вам ошибки. Например. #include <vector> и убедитесь, что вы используете std::vector (чтобы не полагаться на его нахождение в глобальном пространстве имен, что делается в некоторых, в основном старых и устаревших в настоящее время реализациях) случаях, когда вы получаете «вектор не называет тип».

Возможно, вы также столкнулись с зависимыми типами , и в этом случае вы добавили бы typename.

1 голос
/ 02 декабря 2009

Это зависит от того, что вы подразумеваете под собственно . Если вы имеете в виду усиление языка, то его действительно нет. На самом деле, вам даже не нужно называть это ".h". Я видел ".c" файлы #include в рабочем коммерческом коде (имя не указано для защиты виновных). #include - это просто взлом препроцессора для получения некоторой грубой модульности в языке, позволяя файлам включать другие файлы в текстовом формате. Все, что вы склонны считать стандартной практикой, - это просто полезные идиомы, разработанные людьми с течением времени.

Это не поможет вашей текущей проблеме.

Я предполагаю, что на самом деле вы видите много пропущенных символов из-за различий в платформах. Ничего из-за странно сформированных .h файлов вообще.

Возможно, старый код был написан для работы со старым компилятором Си в стиле K & R. У них были странности, такие как неявные объявления функций (любая ссылка на необъявленную подпрограмму предполагала, что она вернула int, а все ее параметры были int). Вы можете попробовать проверить, есть ли у вашего компилятора флаг K & R, но многие помеченные вещи могут фактически быть скрытыми ошибками в старом коде.

0 голосов
/ 02 декабря 2009

Я думаю, что лучшее, что вы можете сделать, это проверить макет любых файлов библиотеки.

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