2016-07-11 1 views
0

Итак, этот вопрос, вероятно, будет сбит мгновенно, но я недавно начал изучать C++, и я заметил, что есть строка кода, которая является:Инициализация строк в C++

#include <string> 

ли это значит, что если у меня была программа, которая заявила:

#include <iostream> 

using namespace std; 

int main() { 
    string foo = "test"; 
    cout << foo; 
} 

не удалось бы ее правильно скомпилировать? И если это так, означало бы это, что Струны должны быть в более явном выражении «импортированы»? Если есть какие-либо проблемы с приведенным ниже кодом, пожалуйста, дайте мне знать. Извините, если это был плохой вопрос.

+0

Вы пытались скомпилировать его? –

+0

Что такое '# includes'? – PaulMcKenzie

+0

Пожалуйста, попробуйте составить его самостоятельно. Я скомпилировал его на eclipse и не обнаружил ошибки. PS, я предложил изменить ваше сообщение. Используйте '# include', а не' # includes'. Кроме того, используйте 'using namespace std;' или 'std ::' –

ответ

1

Вы должны инициализировать строку сначала #include<string>, а затем std::string nameofstring. Редактировать: для cout вы также должны использовать std::cout, если вы не хотите использовать пространства имен.

+0

вам нужно использовать '' not '' –

+0

Зависит от используемого компилятора. '' используется в старых компиляторах, таких как Turbo C++ –

+0

Если бы я использовал using namespace std;, мог ли я избавиться от std :: in std :: string? –

0

Прежде всего, первоначально показанный код не будет компилироваться независимо от того, что было #include d. Это потому, что имя класса std::string, а не string. Как вы в конце концов выяснили, и обновили свой вопрос.

Каждый класс или шаблон или любой другой ресурс, определенный библиотекой C++, требует, чтобы соответствующий стандартный заголовочный файл был #include d. Хотя включение конкретного файла заголовка также косвенно может включать в себя некоторые другие, поэтому вы получите бесплатное содержимое этих файлов заголовков », это будет полагаться на специфику компилятора. Когда я регулярно обновляю свой код и переустанавливаю его на более новую версию gcc, я часто нахожу несколько бит, кое-где, которые теперь пропускают явный #include правого файла заголовка, потому что, бессознательно, я его пропустил, но предыдущая версия компилятора файлы заголовков в конечном итоге потянули его.

Итак, после определения имени класса до std::string вы можете узнать, что полученный код выполняет или не компилируется. Если он компилируется, это связано только с хорошими достоинствами ваших заголовков конкретного компилятора, и это может не компилироваться другими компиляторами или более новыми версиями того же самого компилятора, который вы используете.

P.S. Вы должны avoid using namespace std;, this is bad practice. Поскольку вы начали изучать C++, теперь была бы лучшая возможность избежать приобретения плохих привычек программирования.

1

не удалось бы его правильно скомпилировать? Может или не может. Это неопределенное поведение.

В C++ декларация должна предшествовать определениям и использованию. Итак, если вы используете определение, компилятор ожидает, что вы объявите где-нибудь, прежде чем использовать его.

Общее соглашение состоит в том, чтобы включать все декларации внутри файла заголовка, и это верно для всех типов, которые поставляются со стандартной библиотекой. Если вы планируете использовать один из стандартных типов библиотек, шаблонов, констант или значений, вы должны знать, откуда это объявление будет присутствовать, и включить его в свою единицу перевода, в противном случае это будет неопределенное поведение.

+0

Недавно я редактировал код, показанный выше. В предыдущей версии не было 'using namespace std;' и использовалось '# includes'. Таким образом, он не будет компилироваться правильно. –

+0

@VaibhavBajaj: Я считаю, что вы сделали неправильное редактирование. Это аннулирует исходный вопрос и тем не менее делает ответы нерелевантными. – Abhijit

+0

Я не знал, что такая замечательная аудитория придет до того, как мое редактирование будет одобрено. Мне очень жаль всех неудобств, вызванных до сих пор. –

1

Было бы ошибкой приравнивать #include с импортом java: если вы импортируете модуль, у вас есть все его определения и код. #include Что-то не гарантирует, что у вас есть все. В C++ заголовки часто используются для разделения определений между модулями, так что b.cpp знает, насколько велика class A от a.cpp и т. Д.Реализация хранится в отдельных, скомпилированных, двоичных файлах или библиотеках, а #include автоматически не связывает их с вашим проектом.

Рассмотрим следующий пример:

// foo.h 
class Foo { 
public: 
    Foo(); 
}; 

// foo.cpp 
#include <iostream> 
#include "foo.h" 
Foo::Foo() { 
    std::cout << "hello\n"; 
} 

"foo.h" содержит декларацию из Foo, но не хватает функциональности. Если я сейчас напишу еще один файл:

// bar.cpp 
#include "foo.h" 

int main() { 
    Foo f; 
} 

это компилируется отлично. Но когда он дойдет до стадии компоновки, он пожалуется, что у меня нет определения (реализация) Foo::Foo(). Вы должны явно связать два двоичных файла вместе, чтобы создать исполняемый файл. С GCC/Clang, который будет

g++ -Wall foo.cpp bar.cpp 

Или, если вы включили "Foo" в библиотеку:

g++ -Wall bar.cpp -lfoo 

С IDE как Eclipse, в Visual Studio, вам придется вручную информировать проект необходимости включить дополнительный файл/библиотеку cpp/файл/библиотеку.

Смежные вопросы