2010-11-25 3 views
1

Я пытаюсь без везения включить string s в мой начинающий проект для начинающих API C++ Win32. Код не будет компилироваться, если я определяю string. Что происходит?C++ Win32 API включает <string>


Детали:

Я работал в Dev C++, но теперь переключился на Code :: Blocks с помощью "Gnu GCC компилятора" (по умолчанию?).

Вот случаи, кода я пытался, все похожи, с их результатами:

компилирует успешно:

#include <windows.h> 
#include <string.h> //<string> throws "no such file or directory" 

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
//...the rest works perfectly, omitted in following examples 

Сбой:

#include <windows.h> 
#include <string.h> 

// Error: "string" does not name a type 
string myString; 

// ...WndProc 

компилирует успешно:

#include <windows.h> 
#include <string.h> 
using namespace std; 

// ...WndProc 

Не удается:

#include <windows.h> 
#include <string.h> 
using namespace std; 

// Error: "string" does not name a type 
string myString; 

// ...WndProc 

Сбой:

#include <windows.h> 
#include <string.h> 

// Error: expected constructor, destructor, or type conversion before "myString" 
// Error: expected ',' or ';' before "myString" 
std::string myString; 

// ...WndProc 

Я задал этот вопрос несколько дней назад, но удалил его, потому что казалось, как немой вопрос. Однако он не был решен и теперь вернулся, чтобы преследовать меня. Заранее спасибо.

ответ

2

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

+0

Не с gcc. GCC будет компилировать любой файл, который вы бросаете на него на том языке, о котором вы ему рассказываете. Компиляция файла .cpp с помощью «gcc», например, успешно скомпилирует программу, но не сможет связать ее со стандартной библиотекой C++. Коммутаторы и/или arg0 - это указать язык, используя, например, «g ++» вместо «gcc». –

+0

Да, это проблема. Изменено расширение и удалено '.h', и он работает нормально. Большое спасибо вам и @Noah. – Ben

+0

Угадайте, что gcc обращает внимание на расширение. Просто посмотрел на страницу руководства. Конечно, можно переопределить. –

2

#include <string.h> //<string> throws "no such file or directory"

Что-то серьезно нарушено либо ваша установка компилятора или использования его. Что бы ни случилось после этого, неспособность включить заголовок для std::string сделает его очень трудным в использовании.

Вы можете установить GCC-пакет без поддержки C++, возможно, это ваша проблема.

+0

С уважением, Ной, снова проверил удаление «.h» и по какой-то причине он отлично справился. Еще нет решения, но пока это хорошо. Будет приниматься, когда таймер закончится (если не будет лучшего ответа). – Ben

+0

Извините @ Марсело прибил его. Имейте +1, хотя с моей благодарностью. – Ben

0

<string.h> содержит макросы и декларации функций строки ANSI C (см. here), а не C++ string. Чтобы использовать std::string, что вам нужно сделать иметь

#include <string> 

(не .h)

#include <windows.h> 
#include <string> 

std::string myString; 
+0

ОП знает это уже и указал, что это не удается. –

+0

Умм, нет - см. Его комментарий к ответу @ Ноа выше: «Спасибо, Ной, снова проверил, удалив .h и по какой-то причине он отлично справился». Да, причина в том, что он отлично работает, потому что это правильная вещь. – bgporter

+0

Как можно ответить на этот вопрос? Это информативно и полезно. Если автор вопроса следовал этим инструкциям, это привело бы его к следующей проблеме (поскольку у него было расширение .c вместо .cpp). +1 от меня bgporter. –

0

string.h имеет только методы обработки строки. Например, strcpy, strlen и т. Д. (Http://opengroup.org/onlinepubs/007908799/xsh/string.h.html)

Если вы хотите использовать std :: string, вы должны использовать. Если файла нет, проверьте этот файл.

Удачи :)

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