Task 1 Compile, Code Organization and C++ Templates
Извинявам се за глупавия въпрос, но или аз съм нещо прегрял и не мога да схвана нищо или наистина съм много зле.Можете ли да ми обясните това "using STANDARD_TEMPLATE_LIBRARY;" тук какво трябва да правя с него:
#include "Defines.h"
int main() {
#ifndef DONT_COMPILE_THIS
this here has compilation errors : )
#endif // !DONT_COMPILE_THIS
using STANDARD_TEMPLATE_LIBRARY;
string input;
cin >> input;
cout << input << endl;
return 0;
}
пробвах какво ли не ....това Namespace ли е или трябва да го дефинирам по друг начин...просто при мен не става...свети в червено и това е ...
Мерси колега, но какво ли не изчетох и прегледах лекцията сигурно 20 пъти и НЕ МОГА! Не разбирам...какво трябва да направя...
#ifndef DEFINES_H
#define DEFINES_H
#define DONT_COMPILE_THIS
#define STANDARD_TEMPLATE_LIBRARY
#include <string>
#include <iostream>
using namespace std;
#endif // !DEFINES_H
това пиша и всичко светва нормално освен този "using" ...... какви ли не задачки решавах досега и тази която няй вероятно е от 5 реда не мога....
Привет, отново.
Нямаш грижи. Обяснявам отдалече.
Правим си макро
#define ABRA CADABRA
и по нататък в main()-а имаме
int main() {
std::cout << ABRA << std::endl;
return 0;
}
Какво ще се случи?
Компилаторът преди да компилира твоя файл първо ще изпълни предпроцесорните директиви -> т.е. ще дифинира ABRA и по нататък в main()-а среща това ABRA и прави find-and-replace. Т.е. ABRA се заменя със CADABRA.
След като са се изпълнили предпроцесорните директиви сме останали със следния код:
int main() {
std::cout << CADABRA << std::endl;
return 0;
}
Компилацията на този код ще ти гръмне, защото ще ти изреве - "не знам какво е CADABRA".
(Ако беше "CADABRA" /в кавички/ - това вече е нещо, което компилатора знае и щеше да сработи).
Това беше само за демонстрация как работят нещата щом не ти е станало ясно.
Дай сега да погледнем твоя случай.
Имаш #define STANDARD_TEMPLATE_LIBRARY
т.е. ти просто казваш - Дефинирам, че STANDARD_TEMPLATE_LIBRARY съществува, но то няма стойност.
Какво значи, че съществува?
Значи, че ако някой направи предпроцесорна проверка
#ifdef STANDARD_TEMPLATE_LIBRARY
//това би влязло тук, защото е дефинирано
#endif
Ок. Дефинирано е, но то няма стойност.
В скелета на програмата (в main()-а) имаш
using STANDARD_TEMPLATE_LIBRARY;
Компилаторът ще направи find-and-replace и това ще се разпъне до "нищо"
т.е. ще се получи кодът:
using ;
Това е компилационна грешка. Отделно, че string-а на долния ред ще ти гръмне, че нямаш std namespace-a.
И сега след тези 2 тона хакове от живота казваме:
#define STANDARD_TEMPLATE_LIBRARY namespace std
След това кода:
using STANDARD_TEMPLATE_LIBRARY;
ще се разпъне до:
using namespace std;
По-здрави :)
Привет отново!
Боже то какво било...мина ми през акъла, но дали го направих не помня...
благодаря ти отново колега, сега дори разбрах много по-добре всичко!
По-здрави и от мен! Златен си!