Ошибка Β«was not declared in this scopeΒ»** β€” ΠΎΠ΄Π½Π° ΠΈΠ· самых распространённых ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ программисты Π½Π° C++. Она Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° компилятор Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ объявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ класса Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ области видимости. На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд каТущаяся Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ, эта ошибка часто скрываСт Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² структурС ΠΊΠΎΠ΄Π°: ΠΎΡ‚ ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΎΠΊ Π΄ΠΎ Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ³ΠΎ порядка ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ возникновСния ошибки, ΠΎΡ‚ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… (Π·Π°Π±Ρ‹Π»ΠΈ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ) Π΄ΠΎ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… (ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ пространств ΠΈΠΌΡ‘Π½ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΎΠΉ). Π’Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ Π΄ΠΈΠ°Π³Π½ΠΎΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π·Π° 30 сСкунд, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ стандартныС инструмСнты GCC/Clang, ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Ρ‡Π΅ΠΊ-лист для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ΄Π° ΠΏΠ΅Ρ€Π΅Π΄ компиляциСй. ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΊΠ°ΠΊ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°ΠΌ, Ρ‚Π°ΠΊ ΠΈ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΌ с ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ.

Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ошибка Β«was not declared in this scopeΒ»?

Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ компилятора error: β€˜ΠΈΠΌΡβ€™ was not declared in this scope Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚: Β«ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ имя Π½Π΅ объявлСн Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ области видимости». Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»ΠΈΠ±ΠΎ:

  • πŸ”Ή НС ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ (ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ° Π² ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ Π·Π°Π±Ρ‹Π»ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ объявлСниС).
  • πŸ”Ή ΠžΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹, Π½ΠΎ Π½Π΅ Π²ΠΈΠ΄Π½Ρ‹ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ контСкстС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Π±Π΅Π· ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°).
  • πŸ”Ή ΠžΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΠΏΠΎΠ·ΠΆΠ΅, Ρ‡Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ (ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с порядком ΠΊΠΎΠ΄Π°).
  • πŸ”Ή Π‘ΠΊΡ€Ρ‹Ρ‚Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, локальная пСрСмСнная ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ минимального ΠΊΠΎΠ΄Π°, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎΡˆΠΈΠ±ΠΊΡƒ:

#include <iostream>

int main() {

x = 5; // Ошибка: 'x' was not declared in this scope

std::cout << x;

return 0;

}

Π—Π΄Π΅ΡΡŒ пСрСмСнная x Π½Π΅ объявлСна, поэтому компилятор GCC ΠΈΠ»ΠΈ Clang выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π˜ΡΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ строки int x; ΠΏΠ΅Ρ€Π΅Π΄ использованиСм.

πŸ“Š Π‘ ΠΊΠ°ΠΊΠΎΠΉ частотой Π²Ρ‹ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π΅Ρ‚Π΅ΡΡŒ с этой ошибкой?
  • Часто (Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎ)
  • Иногда (Ρ€Π°Π· Π² нСдСлю)
  • Рядко (Ρ€Π°Π· Π² мСсяц)
  • Никогда Π½Π΅ Π²ΠΈΠ΄Π΅Π»

Π’ΠΎΠΏ-5 ΠΏΡ€ΠΈΡ‡ΠΈΠ½ ошибки ΠΈ ΠΊΠ°ΠΊ ΠΈΡ… ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ

Рассмотрим Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространённыС сцСнарии возникновСния ошибки ΠΈ способы ΠΈΡ… устранСния. Начнём с простых случаСв ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ ΠΊ Π±ΠΎΠ»Π΅Π΅ слоТным.

1. ΠžΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ° Π² ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°

Бамая базовая ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° β€” ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ° Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НапримСр:

int counter = 0;

// ...

countr++; // Ошибка: ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ° Π² 'countr' вмСсто 'counter'

πŸ” Как ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ: Π’Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ сравнитС имя Π² ошибкС с объявлСниСм. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ поиска Π² IDE (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ctrl+F Π² VS Code ΠΈΠ»ΠΈ CLion).

2. ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ объявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Если Π²Ρ‹ Π·Π°Π±Ρ‹Π»ΠΈ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄ Π΅Ρ‘ использованиСм, компилятор Π½Π΅ смоТСт Π΅Ρ‘ Π½Π°ΠΉΡ‚ΠΈ. НапримСр:

void printHello(); // ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ отсутствуСт

int main() {

printHello(); // Ошибка, Ссли ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π½Π΅ объявлСн Π²Ρ‹ΡˆΠ΅

return 0;

}

void printHello() { // ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΠΈΠΆΠ΅ Π²Ρ‹Π·ΠΎΠ²Π°

std::cout << "Hello!";

}

βœ… РСшСниС: Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (void printHello();) ΠΏΠ΅Ρ€Π΅Π΄ main() ΠΈΠ»ΠΈ пСрСнСситС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡˆΠ΅.

3. НС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ класс ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, std::vector), Π½ΠΎ Π·Π°Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» (#include <vector>), компилятор Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ ΠΎ сущСствовании этого ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°.

πŸ“Œ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ошибки:

int main() {

std::vector<int> nums; // Ошибка, Ссли Π½Π΅Ρ‚ #include <vector>

return 0;

}

πŸ”§ Как ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ: Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹. Для стандартных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ C++ список ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, cppreference.com).

4. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости (scope)

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² C++ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости (scope). НапримСр, пСрСмСнная, объявлСнная Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π΅ Π²ΠΈΠ΄Π½Π° Π·Π° Π΅Ρ‘ ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ:

void foo() {

int x = 10;

}

int main() {

std::cout << x; // Ошибка: 'x' Π½Π΅ Π²ΠΈΠ΄Π½Π° Π²Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ foo()

return 0;

}

πŸ”Ή Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ случаи:

  • πŸ”Έ ИспользованиС локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π²Π½Π΅ Π΅Ρ‘ Π±Π»ΠΎΠΊΠ° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, послС Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ„ΠΈΠ³ΡƒΡ€Π½ΠΎΠΉ скобки }).
  • πŸ”Έ ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° доступа ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ пространства ΠΈΠΌΡ‘Π½ Π±Π΅Π· указания прСфикса (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, std::cout вмСсто просто cout, Ссли Π½Π΅Ρ‚ using namespace std;).

5. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с порядком компиляции ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ

Π’ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ошибка ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ΠΈΠ·-Π·Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ порядка компиляции Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ»ΠΈ отсутствия Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ. НапримСр:

  • πŸ”Ή Ѐункция объявлСна Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Π½ΠΎ Π΅Ρ‘ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ отсутствуСт Π² .cpp-Ρ„Π°ΠΉΠ»Π΅.
  • πŸ”Ή БтатичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Π±Ρ‹Π»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ -lm для Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ с math.h).

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ CMake, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ всС исходныС Ρ„Π°ΠΉΠ»Ρ‹ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² Ρ†Π΅Π»ΡŒ компиляции (add_executable ΠΈΠ»ΠΈ add_library).

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ имя ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π½Π° ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ|

Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ пСрСмСнная/функция объявлСна ΠΏΠ΅Ρ€Π΅Π΄ использованиСм|

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² (#include)|

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ using namespace std; ΠΈΠ»ΠΈ уточняйтС пространство ΠΈΠΌΡ‘Π½ (std::)|

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ {})-->

Как Π΄ΠΈΠ°Π³Π½ΠΎΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π·Π° 30 сСкунд

Π§Ρ‚ΠΎΠ±Ρ‹ быстро Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ошибки, слСдуйтС этому Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ:

  1. ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ сообщСниС компилятора. Оно содСрТит:
    • πŸ“Œ Имя ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 'x').
    • πŸ“Œ Π€Π°ΠΉΠ» ΠΈ строку, Π³Π΄Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка.
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, объявлСн Π»ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ поиск ΠΏΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ (Ctrl+Shift+F Π² VS Code).
  • Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ объявлСниС Π²ΠΈΠ΄Π½ΠΎ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ контСкстС. НапримСр, Ссли функция объявлСна Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ пространства ΠΈΠΌΡ‘Π½. Если ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈΠ· std, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ std:: ΠΈΠ»ΠΈ using namespace std;.
  • πŸ’‘ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π°Π½Π°Π»ΠΈΠ·Π°:

    main.cpp:5:9: error: β€˜printMessage’ was not declared in this scope
    

    printMessage();

    ^~~~~~~~~~~

    Π—Π΄Π΅ΡΡŒ компилятор Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ функция printMessage Π½Π΅ объявлСна Π² строкС 5 Ρ„Π°ΠΉΠ»Π° main.cpp. РСшСния:

    • πŸ”Ή ΠžΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Ρ‹ΡˆΠ΅ main() (ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ).
    • πŸ”Ή ΠŸΠ΅Ρ€Π΅Π½Π΅ΡΡ‚ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡˆΠ΅ Π΅Ρ‘ Π²Ρ‹Π·ΠΎΠ²Π°.
    • πŸ”Ή ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Π³Π΄Π΅ объявлСна функция.
    πŸ’‘

    Π’ GCC ΠΈ Clang ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ -E для просмотра прСпроцСссированного ΠΊΠΎΠ΄Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, g++ -E main.cpp). Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ фактичСски ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ макросы Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹.

    РаспространённыС ошибки Π² ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…

    Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… с мноТСством Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ошибка Β«was not declared in this scopeΒ»** ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌΠΈ способами. Рассмотрим Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ сцСнарии:

    1. ЦикличСскиС зависимости Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²

    Если Π΄Π²Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°, это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ компилятор Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ объявлСния. НапримСр:

    // File A.h
    

    #include "B.h"

    class A { /* ... */ };

    // File B.h

    #include "A.h"

    class B { /* ... */ };

    βœ… РСшСниС: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ объявлСния (forward declarations) вмСсто #include, Π³Π΄Π΅ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ:

    // File A.h
    

    class B; // ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ объявлСниС

    class A { /* ... */ };

    // File B.h

    class A; // ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ объявлСниС

    class B { /* ... */ };

    2. ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ пространств ΠΈΠΌΡ‘Π½

    Если Π΄Π²Π° пространства ΠΈΠΌΡ‘Π½ содСрТат ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ нСоднозначности. НапримСр:

    namespace Lib1 {
    

    void func();

    }

    namespace Lib2 {

    void func();

    }

    int main() {

    func(); // Ошибка: нСясно, ΠΊΠ°ΠΊΡƒΡŽ func() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

    return 0;

    }

    βœ… РСшСниС: Π―Π²Π½ΠΎ ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ пространство ΠΈΠΌΡ‘Π½:

    Lib1::func(); // ΠΈΠ»ΠΈ Lib2::func();

    3. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с шаблонами (templates)

    Ошибки с шаблонами часто ΠΏΡ€ΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Β«was not declaredΒ»**, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ компилятор Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ вывСсти Ρ‚ΠΈΠΏΡ‹ ΠΈΠ»ΠΈ Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚ опрСдСлСния шаблонной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НапримСр:

    template<typename T>
    

    void print(T value);

    int main() {

    print(5); // Ошибка, Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ шаблона Π½Π΅ Π²ΠΈΠ΄Π½ΠΎ

    return 0;

    }

    // ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ шаблона Π½ΠΈΠΆΠ΅ Π²Ρ‹Π·ΠΎΠ²Π° (Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΠ΄Π½ΠΎ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ инстанцирования)

    template<typename T>

    void print(T value) {

    std::cout << value;

    }

    βœ… РСшСниС: ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ шаблона Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ использования.

    4. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с макросами ΠΈ прСпроцСссором

    ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ (#define) ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкам. НапримСр:

    #define x 10
    
    

    int main() {

    int x = 5; // Ошибка: 'x' ΡƒΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΊΠ°ΠΊ макрос

    return 0;

    }

    ⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ использования макросов для имСнования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Если макрос Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΠΉΡ‚Π΅ Π΅Π³ΠΎ имя Π² скобки: #define X (10).

    Π’ΠΈΠΏ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° РСшСниС
    ЦикличСскиС зависимости #include "A.h" ΠΈ #include "B.h" Π²Π·Π°ΠΈΠΌΠ½ΠΎ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ объявлСния
    ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ пространств ΠΈΠΌΡ‘Π½ Lib1::func() ΠΈ Lib2::func() Π―Π²Π½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ пространство ΠΈΠΌΡ‘Π½
    Π¨Π°Π±Π»ΠΎΠ½Ρ‹ Π½Π΅ Π²ΠΈΠ΄Π½Ρ‹ ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ шаблона послС Π²Ρ‹Π·ΠΎΠ²Π° ΠŸΠ΅Ρ€Π΅Π½Π΅ΡΡ‚ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»
    ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ ΠΈΠΌΠ΅Π½Π° #define x 10 + int x; Π˜Π·Π±Π΅Π³Π°Ρ‚ΡŒ макросов для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

    ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

    Π Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ нСсколько Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΊΠΎΠ΄Π° с ошибкой ΠΈ способами ΠΈΡ… исправлСния.

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1: Π—Π°Π±Ρ‹Π»ΠΈ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ

    ΠžΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄:

    #include <iostream>
    
    

    int main() {

    std::cout << "Value: " << value; // Ошибка: 'value' нС объявлСна

    return 0;

    }

    Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄:

    #include <iostream>
    
    

    int main() {

    int value = 42; // Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ объявлСниС

    std::cout << "Value: " << value;

    return 0;

    }

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2: НС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»

    ΠžΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄:

    int main() {
    

    std::string name = "Alice"; // Ошибка: Π½Π΅Ρ‚ #include <string>

    return 0;

    }

    Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄:

    #include <string> // Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»
    
    

    int main() {

    std::string name = "Alice";

    return 0;

    }

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3: ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с порядком объявлСний

    ΠžΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄:

    void foo() {
    

    bar(); // Ошибка: 'bar' нС объявлСна

    }

    void bar() {

    std::cout << "Hello!";

    }

    Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ (Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ 1):

    void bar(); // ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
    
    

    void foo() {

    bar(); // Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²ΠΈΠ΄Π½Π°

    }

    void bar() {

    std::cout << "Hello!";

    }

    Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ (Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ 2):

    void bar() {
    

    std::cout << "Hello!";

    }

    void foo() {

    bar(); // ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ 'bar' Π²Ρ‹ΡˆΠ΅ Π²Ρ‹Π·ΠΎΠ²Π°

    }

    Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли ошибка ΠΎΡΡ‚Π°Π»Π°ΡΡŒ послС всСх ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ?

    Если Π²Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ всС ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹, Π½ΠΎ ошибка остаётся, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

    1. **ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚** (ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ ΠΏΠ°ΠΏΠΊΠΈ build/ ΠΈΠ»ΠΈ cmake-build-debug/ ΠΈ пСрСсобСритС).

    2. **ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ„Π»Π°Π³ΠΈ компиляции** β€” Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ стандартныС ΠΏΡƒΡ‚ΠΈ ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ.

    3. **Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ -v Ρ„Π»Π°Π³** Π² GCC/Clang, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ:

    g++ -v main.cpp

    4. **ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π²Π΅Ρ€ΡΠΈΡŽ стандарта C++** β€” Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, std::filesystem) Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ -std=c++17 ΠΈΠ»ΠΈ Π½ΠΎΠ²Π΅Π΅.

    Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ

    Π§Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство ошибок Ρ‚ΠΈΠΏΠ° Β«was not declared in this scopeΒ»**, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ инструмСнты:

    1. БтатичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠΎΠ΄Π°

    • πŸ”§ Clang-Tidy: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ ΡΡ‚ΠΈΠ»ΡŒ ΠΊΠΎΠ΄Π° ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ошибки, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ нСсоотвСтствия Ρ‚ΠΈΠΏΠΎΠ².
    • πŸ”§ Cppcheck: ЛСгковСсный Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для поиска Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… ошибок.

    πŸ“Œ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Clang-Tidy:

    clang-tidy main.cpp --checks=* --fix

    2. IDE с подсвСткой ошибок

    Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (CLion, VS Code с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ C++, Qt Creator) ΠΏΠΎΠ΄ΡΠ²Π΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π½Π΅ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π΅Ρ‰Ρ‘ Π΄ΠΎ компиляции. НапримСр, Π² VS Code:

    • πŸ”Ή ΠΠ΅ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ‡Ρ‘Ρ€ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ красным.
    • πŸ”Ή ΠŸΡ€ΠΈ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΈ курсора показываСтся подсказка с ошибкой.

    3. CMake ΠΈ систСмы сборки

    Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ CMake, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ:

    • πŸ”Ή ВсС исходныС Ρ„Π°ΠΉΠ»Ρ‹ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² Ρ†Π΅Π»ΡŒ (add_executable).
    • πŸ”Ή Π£ΠΊΠ°Π·Π°Π½Ρ‹ ΠΏΡƒΡ‚ΠΈ ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ (target_include_directories).
    • πŸ”Ή ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (target_link_libraries).

    πŸ“„ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ CMakeLists.txt:

    cmake_minimum_required(VERSION 3.10)
    

    project(MyProject)

    add_executable(my_app main.cpp utils.cpp)

    target_include_directories(my_app PRIVATE ${CMAKE_SOURCE_DIR}/include)

    target_link_libraries(my_app PRIVATE some_library)

    πŸ’‘

    ВсСгда провСряйтС Π²Ρ‹Π²ΠΎΠ΄ компилятора Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ (warnings) β€” ΠΎΠ½ΠΈ часто ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ источники ошибок, Π΄Π°ΠΆΠ΅ Ссли ΠΊΠΎΠ΄ компилируСтся.

    FAQ: ЧастыС вопросы ΠΏΠΎ ошибкС

    ΠŸΠΎΡ‡Π΅ΠΌΡƒ ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, Π΄Π°ΠΆΠ΅ Ссли пСрСмСнная объявлСна?

    Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ нСскольким ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ:

    • πŸ”Ή ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ объявлСна послС Π΅Ρ‘ использования (Π² C++ порядок Π²Π°ΠΆΠ΅Π½).
    • πŸ”Ή ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ объявлСна Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ пространствС ΠΈΠΌΡ‘Π½ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, std::), Π½ΠΎ прСфикс Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½.
    • πŸ”Ή ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ объявлСна Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Π½ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½.
    • πŸ”Ή ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ скрыта локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ.

    πŸ” Как Π΄ΠΈΠ°Π³Π½ΠΎΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ({}) ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ поиск ΠΏΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ (Ctrl+Shift+F).

    Как ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, std::cout)?

    Ошибка с std::cout ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ стандартными ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ:

    1. НС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» (#include <iostream> для cout).
    2. НС ΡƒΠΊΠ°Π·Π°Π½ΠΎ пространство ΠΈΠΌΡ‘Π½ (std::cout вмСсто просто cout, Ссли Π½Π΅Ρ‚ using namespace std;).
    3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нСвСрная вСрсия стандарта C++ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, std::filesystem Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ -std=c++17).

    βœ… РСшСниС: Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ #include <iostream> ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ std::cout.

    ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ΠΈΠ·-Π·Π° ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅?

    Π”Π°! Если имя Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° написано с ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΎΠΉ, компилятор Π½Π΅ смоТСт Π΅Π³ΠΎ Π½Π°ΠΉΡ‚ΠΈ, ΠΈ всС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΈΠ· этого Ρ„Π°ΠΉΠ»Π° станут Β«Π½Π΅ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΌΠΈΒ». НапримСр:

    #include <vectorr> // ΠžΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ°: Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ <vector>

    πŸ”§ Как ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ: Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ:

    • πŸ”Ή Имя Ρ„Π°ΠΉΠ»Π° написано ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ (рСгистр ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Linux!).
    • πŸ”Ή Π€Π°ΠΉΠ» сущСствуСт Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ ΠΏΡƒΡ‚ΠΈ (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ #include "myheader.h" vs #include <myheader>).
    • πŸ”Ή ΠŸΡƒΡ‚ΠΈ ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π² настройках ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (Π² CMake это include_directories).
    ΠŸΠΎΡ‡Π΅ΠΌΡƒ ошибка появляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… β€” Π½Π΅Ρ‚?

    Π­Ρ‚ΠΎ типичная ситуация для ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹:

    • πŸ”Ή Π’ ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с объявлСниСм, Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ β€” Π½Π΅Ρ‚.
    • πŸ”Ή Π Π°Π·Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ„Π»Π°Π³Π°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ -std=c++11, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” -std=c++17).
    • πŸ”Ή Π’ ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ using namespace, Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ β€” Π½Π΅Ρ‚.
    • πŸ”Ή ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с порядком компиляции (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» зависит ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, Π½ΠΎ компилируСтся Ρ€Π°Π½ΡŒΡˆΠ΅).

    πŸ”§ РСшСниС: Unified всС настройки компиляции ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π²ΠΎ всСх Ρ„Π°ΠΉΠ»Π°Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

    Как ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этой ошибки Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ?

    Π‘Π»Π΅Π΄ΡƒΠΉΡ‚Π΅ этим рСкомСндациям:

    • πŸ”Ή Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ соврСмСнныС IDE (CLion, VS Code), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄ΡΠ²Π΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π½Π΅ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.
    • πŸ”Ή Π‘Π»Π΅Π΄ΡƒΠΉΡ‚Π΅ соглашСниям ΠΎΠ± ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, camelCase для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, PascalCase для классов), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΎΠΊ.
    • πŸ”Ή РаздСляйтС объявлСния ΠΈ опрСдСлСния: объявлСния β€” Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… (.h), опрСдСлСния β€” Π² .cpp.
    • πŸ”Ή Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ статичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ (Clang-Tidy, Cppcheck) для автоматичСской ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ.
    • πŸ”Ή ΠŸΠΈΡˆΠΈΡ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Π΅ тСсты β€” ΠΎΠ½ΠΈ часто Π²Ρ‹ΡΠ²Π»ΡΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с областями видимости Π½Π° Ρ€Π°Π½Π½ΠΈΡ… этапах.