Чи хороша практика використання файлів заголовків C ++ без розширення?


9

У мене є аргумент з моїм колегою щодо керівних принципів C ++.

В даний час він розробляє всі свої бібліотеки таким чином:

  • У своїх іменах він використовує непослідовні великі та малі літери
  • Деякі його заголовки не мають жодного розширення

Я вважаю, що відсутність розширення - це щось зарезервоване для стандартних файлів на C ++ і що використання великих літер схильне до помилок (особливо, коли ви маєте справу з кодом, який повинен працювати як в Windows, так і в Linux).

Його сенс полягає в тому, що він дотримується Qtконвенцій (навіть для коду, який не використовує Qt) і продовжує говорити: "Якщо Qt робить це так, то це не може бути поганим".

Зараз я намагаюся зберігати роздуму, але мені дуже погано, коли мені доводиться працювати / з його бібліотеками. Чи існує спільний встановлений набір правил щодо цього? Чи говорить про це стандарт щось?

Дуже дякую.


3
#define signal……… (“Якщо Qt робить це так, то це не може бути поганим.”) - Я не можу сказати, що я особисто згоден з усіма їхніми дизайнерськими рішеннями.
Джастін

@Justin: Я також не маю нічого проти Qt. Я навіть думаю, що це дивовижна бібліотека, але деякі їхні варіанти дизайну мені справді не так.
ereOn

1
@Justin Я бачив макроси, починаючи з _популярного, широко використовуваного коду, але це однозначно проти стандарту.
Лучіан Григоре

1
але ось одна реальна причина уникати заголовків без розширень: мій основний IDE і текстовий редактор не розпізнає їх автоматично. я просто використовую *.hppдля заголовка c ++, і всі мої інструменти "отримують його".
Джастін

5
Qt використовує цю умову саме тому , що розумні програмісти цього не роблять. Це означає, що ваші заголовки не зіткнуться з новими заголовками Qt.
MSalters

Відповіді:


16

Наскільки я знаю, розширення (або його відсутність) не спричинить проблем. Я б сказав, що видаляти розширення взагалі незручно, оскільки це ускладнює пошук файлів заголовків (наприклад, за допомогою підстановок * .h та * .hpp) і ускладнює ідентифікацію вмісту файлу (наприклад, якщо ваш редактор покладається на розширення, щоб вибрати правильний режим виділення синтаксису).

З точки зору коду це не має великої різниці, навіть корпус не є проблематичним, якщо ви використовуєте послідовний регістр скрізь і не покладаєтесь лише на відмінності в регістрі для диференціації файлів. З точки зору зручності, простіше дотримуватися малих речей і мати розширення (або .h або .hpp).

Однак важливіше, що будь-яке з перерахованих вище, однак, полягає в тому, щоб вибрати одну конвенцію для всієї команди розробників і дотримуватися її . Набагато гірше доводиться шукати, яким файлом створено ім'я, ім'я та яке розширення він використовує, коли ви хочете щось включити - все це повинно бути "доцільним" із знаннями того, що ви намагаєтеся використовувати.


Вибір однієї конвенції та дотримання її не є поганою ідеєю, але що робити, якщо існуючу конвенцію можна вдосконалити? У такому випадку, можливо, буде корисно змінити курс.
kotlinski

@kotlinski Це один із тих випадків, коли ви нічого не можете зробити, щоб покращити ситуацію, тому що все, що ви виберете, - це питання переваги. Насправді, мати якесь розширення, я б сказав, краще, ніж жодне, тому що ОС (читай, Windows) може визначити, з якою програмою відкривати файл на основі розширення.
Павло

@PaulManta: Але ти тут не сперечаєшся? По-перше, ви кажете, що не можна нічого поліпшити. Тоді, ви кажете, мати розширення краще, ніж ні. Це своєрідне дефектистське ставлення, яке говорить про те, що зміни неможливі.
kotlinski

@kotlinski Загалом, я думаю, це залежить від того, з яким старим кодом ви працювали б, чи можна було б все це змінити на нову конвенцію та який би вплив мала змішання конвенцій. У цьому випадку, хоча я погоджуюся з Полом Мантою, - це переважно особисті переваги, більшість яких віддається перевазі з практичних причин.
Адам Боуен

1
@kotlinski Неможливо нічого покращити, але є способи погіршити ситуацію. Ця дискусія така ж безглузда, як і дискусія пробілів проти вкладки. Просто виберіть одну умову та йдіть робити щось корисне.
Павло

6

Не існує правила (у стандарті), що лише стандартні файли заголовків можуть бути без розширення; ім'я файлу може бути майже всім, що ви хочете. Загальна добра практика, однак, говорить про те, що:

  1. жоден файл не може бути без розширення та

  2. Файли різних типів мають різні розширення - зокрема, заголовки C ++ використовують інше розширення ( .hppабо .hh), ніж заголовки, прийнятні для компілятора C.

(На жаль, друге правило часто порушується, і часто видно файли заголовків C ++ .h. З особистого досвіду я можу запевнити, що це спричинить проблеми з технічним обслуговуванням в дорозі, але це звичайна практика.)

Що стосується випадку, то потрібна надзвичайна обережність, оскільки в деяких системах назви файлів залежать від регістру, а не в інших. Я бачив два різні правила, які працюють: або все в малому регістрі, або ім'я файлу дотримується абсолютно тих самих правил щодо регістру, як і для символів у C ++.

В обох випадках ви встановлюєте правила для проекту консенсусом, і всі дотримуються їх.


1
Я повністю з Джеймсом на цьому. Це робить кошмаром отримання інструментів для належної роботи над двома різними типами файлів заголовків, якщо вони мають однакове розширення.

@TomTanner І ще гірше, якщо у вас є файли без розширень. Я здебільшого працював у середовищі Unix, і мене завжди засмучувало (і спричиняло проблеми), що виконувані файли не мають розширення.

6
If Qt does it that way, then it can't be bad.

Так. Так, це справді, справді може. Їх дизайн бібліотеки: "Ми так сильно хочемо бути Java". Це тотальний безлад. Бібліотека Standard набагато краще.

Також, принципово, це логічна помилка. Дизайн Qt варто наслідувати лише тоді, коли ви можете дати логічні аргументи про те, чому це добре, це не добре лише тому, що це Qt.


Це емпіричний аргумент. Це великий програмний продукт, який використовується багатьма людьми. Якби цей вибір конвенції про іменування спричинив значні проблеми, це було б відомо і, ймовірно, змінилось би на сьогодні. Оскільки це не так, це не може бути занадто поганим. Це не означає, що це найкраще рішення.
Х. Ріттіч

0

Як я знаю, з 1998 р. Без стандартних заголовків бібліотеки були б лише .h. Отже, нестандартні файли заголовків C ++, як правило, все ще записуються за допомогою .h. Але майте на увазі, що це конвенція, ви не можете використовувати розширення або навіть .txt розширення, це як ви пишете свої класи, починаючи з нижнього регістру, воно все ще працює, але це не умова.


3
Btw "Якщо Qt робить це так, то це не може бути поганим". це справді поганий аргумент ...

2
Стандарт не має нічого сказати про те, як визначені користувачем заголовки повинні бути іменами. Він лише вказує назви стандартних заголовків.
Майк Сеймур

0

Це конвенції, а не правила, немає обмежень дотримуватися конвенцій, але конвенції полегшують життя, коли ви приїжджаєте для ознайомлення.

відповідно до розширень (.h, .hpp) ті файли, які були включені в c ++, не повинні мати розширень; вам потрібно використовувати розширення, якщо ви використовуєте заголовки з інших, ніж c ++, як-от c-бібліотеки або збільшити бібліотеки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.