лекція 02

Хоч ви і не хочете ігнорувати їх, попередження компілятора не є чимось досить серйозним, щоб не скомпілювати вашу програму. Як правило, попередження компілятора - це ознака того, що щось може піти не так під час виконання. Як компілятор дізнається про це? Ви, мабуть робили типові помилки, про які компілятор знає. Типовий приклад - використання оператора присвоювання = замість оператора рівності == всередині виразу. Ваш компілятор також може попередити вас про використання змінних, що не були ініційовані та інших подібних помилках. Як правило, ви можете встановити рівень попереджень вашого компілятора - я встановлюю його на найвищий рівень, так що попередження компілятора не перетворювати в помилки в виконуваної програмі ( "помилки виконання").

Проте, попередження компілятора не повинні зупиняти роботу вашої програми (якщо тільки ви не вкажете компілятору розглядати попередження як помилки), так що вони, ймовірно, не такі серйозні як помилки.

Помилки - це умови, які перешкоджають завершенню компіляції ваших файлів.

Помилки компілятора обмежені окремими файлами вихідного коду і є результатом "синтаксичних помилок". Насправді, це означає, що ви зробили щось, що компілятор не може зрозуміти. Наприклад, вираз for (;) синтаксично правильно, тому що цикл завжди повинен мати три частини. Хоча компілятор очікував крапку з комою, він міг також очікувати умовний вираз, тому повідомлення про помилку, яке ви отримаєте може бути щось на зразок:

line 13, unexpected parenthesis ')'

Зауважте, що помилки компілятора завжди будуть включати номер рядка, в якій була виявлена ​​помилка.

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

could not find definition for X

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

Помилки компілятора - з чого почати?

Якщо ви зіткнулися з переліком п'ятдесяти або шістдесяти помилок і попереджень, то буде складно визначити з чого почати. Найкраще місце, проте, на початку списку. Справді, ви майже ніколи не починаєте виправляти помилки від кінця файлу до його початку з однієї простої причини: ви не знаєте помилки чи вони насправді!

може привести до величезної кількості помилок, можливо, включаючи повідомлення:

extraneous 'int' ignored

Все це через одного символу! Найкраще почати з самого верху.

Аналіз повідомлення про помилку

Більшість повідомлень від компілятора буде складатися як мінімум з чотирьох речей:

тип повідомлення - попередження або помилка;

вихідний файл, в якому з'явилася помилка;

короткий опис те, що не працює належним чином.

Висновок g ++ для зазначеної вище програми може виглядати наступним чином (ваші результати можуть відрізнятися, якщо ви використовуєте інший компілятор):

foo.cc:7: error: semicolon missing after struct declaration

foo.cc це ім'я файлу. 7 - номер рядка, і ясно, що це помилка. Коротке повідомлення тут вельми корисно, оскільки воно показує саме те, що неправильно. Зауважимо, однак, що повідомлення має сенс тільки в контексті програми. Воно не повідомляє, в якій структурі не вистачає коми.

Більш незрозумілим є ще одне повідомлення про помилку з тієї ж спроби компіляції:

extraneous 'int' ignored

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

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

Буде набагато гірше, якщо компілятор буде повідомляти вам, що сталося раніше в програмі. Навіть перша помилка компілятора, яку ви отримаєте, може бути пов'язана з кількома рядками до зазначеного попередження.

Обробка незрозумілих або дивних повідомлень

Є кілька особливо складних типів помилок компілятора. Перший - це неоголошена змінна, яку, як вам здається, ви оголосили. Часто, ви можете вказати, де саме змінна була оголошена! Проблема в тому, що часто змінна просто написана з помилкою. На жаль, це досить важко побачити, так як зазвичай ми читаємо те, що очікуємо, а не те, що є насправді. Крім того, є й інші причини, чому це може бути проблемою - наприклад, проблеми з видимістю!

Друге незрозуміле повідомлення:

unexpected end of file

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

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

Після того як ви остаточно виправили всі помилки синтаксису, задрімав, перекусили пару раз і морально підготували себе до правильної компіляції програми, ви все одно можете зіткнутися з помилками компоновщика. Їх часто досить складно виправити, тому що вони не обов'язково є результатом того, що написано у вашій програмі. Я коротко опишу типові видів помилок компоновщика, які можна очікувати, і деякі шляхи їх вирішення.

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

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

Останній дивний тип помилки компоновщика - повідомлення

undefined reference to main

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

Вибір компіляторів (IDE)

dows: Code :: Blocks з Mingw Code :: Blocks також доступна на Linux

Microsoft Visual C ++

g ++ це C ++ компілятор, який поставляється з більшістю дистрибутивів * NIX

Apple XCode. XCode - IDE для розробки програм в OS X або iPhone.

Qt SDK - кросплатформенних пакет розробки програмного забезпечення.

Схожі статті