using ::bb::cascades::Application;
#include <bb/cascades/Application>
Что означают эти две декларации?
И есть ли хорошие учебники, в которых подробно говорится об использовании директивы / декларации? Спасибо.
#include
это директива препроцессора. Это в основном говорит препроцессору взять данный файл и заменить #include
строка с содержимым файлов.
using
с другой стороны, позволяет использовать имена внутри namespace
(структуры, перечисления, функции) без namespace
префикс. В этом случае ::bb::cascades::Application
позволит вам использовать запись
Application app;
вместо
::bb::cascades::Application app;
если ::bb::cascades::Application
является конструируемым по умолчанию классом.
#include
?»Чтобы использовать функцию или создать объект, компилятор должен знать структуру этих вещей, например сигнатуру функции или член и методы класса. Эти вещи записаны в заголовочных файлах. Давайте посмотрим на очень простой пример, где мы предоставляем некоторый модуль (называемый module
):
module
// MODULE_HPP
// only declarations, no code
namespace module{
struct dummyStruct{
void dummyMethod(char);
char dummyMember;
};
double dummyFunc(double);
};
// MODULE_CPP
// actual implementation
namespace module{
void dummyStruct::dummyMethod(char c){
dummyMember = c;
};
void dummyFunc(double a){
return a + 1;
}
};
Как вы можете видеть наши module
состоит из структуры с членом, методом и простой функцией. Обратите внимание, что мы все обернуть в пространство имен module
, Теперь у нас есть другая программа, которая хочет использовать module
:
#include <iostream>
using module::dummyFunc;
int main(){
std::cout << dummyFunc(1) << std::endl;
}
И это не сработает, потому что компилятор не знает ни о пространстве имен module
, Вам нужно добавить объявление, которое можно сделать с помощью #include
(см. первый абзац этого ответа):
#include <iostream>
#include "module.hpp"using module::dummyFunc;
int main(){
std::cout << dummyFunc(1) << std::endl;
}
Обратите внимание, что вам нужно скомпилировать и module.cpp, и main.cpp, в противном случае вы получите ошибки компоновщика.
Других решений пока нет …