подскажите по VS
Недавно начал изучать C++
В книге написано что обязательный заголовочный файл iostream.h
Приводится такой пример:
void main(void)
{
cout << "Учимся программировать на языке C++!";
}
Решил вставить в Visual C++ 2010 этот код. Создал проект win32, открылось поле для ввода кода, а там уже столько всего:
//
#include "stdafx.h"
#include "VIVOD.h"
#define MAX_LOADSTRING 100
// Глобальные переменные:
HINSTANCE hInst; // текущий экземпляр
TCHAR szTitle[MAX_LOADSTRING]; // Текст строки заголовка
TCHAR szWindowClass[MAX_LOADSTRING]; // имя класса главного окна
// Отправить объявления функций, включенных в этот модуль кода:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: разместите код здесь.
MSG msg;
HACCEL hAccelTable;
// Инициализация глобальных строк
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_VIVOD, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Выполнить инициализацию приложения:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_VIVOD));
// Цикл основного сообщения:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// ФУНКЦИЯ: MyRegisterClass()
//
// НАЗНАЧЕНИЕ: регистрирует класс окна.
//
// КОММЕНТАРИИ:
//
// Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код
// был совместим с системами Win32, не имеющими функции RegisterClassEx'
// которая была добавлена в Windows 95. Вызов этой функции важен для того,
// чтобы приложение получило "качественные" мелкие значки и установило связь
// с ними.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_VIVOD));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_VIVOD);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
//
// ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
// НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
// КОММЕНТАРИИ:
//
// В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
// создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// НАЗНАЧЕНИЕ: обрабатывает сообщения в главном окне.
//
// WM_COMMAND - обработка меню приложения
// WM_PAINT -Закрасить главное окно
// WM_DESTROY - ввести сообщение о выходе и вернуться.
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Разобрать выбор в меню:
switch (wmId)
{
case IDM_about :
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: добавьте любой код отрисовки...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
Зачем это все там присутствует ? Можно ли это удалять ?
Почему проект не собирается с таким кодом в нем:
void main(void)
{
cout << "Учимся программировать на языке C++!";
}
Если можно - по подробнее пожалуйста
// VIVOD.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include "iostream.h"
void main(void)
{
cout << "Учимся программировать на языке C++!";
}
Почитайте про директиву #include, и ваш первый вопрос отпадет.
#include <iostream>
void main(void) {
std::cout << "Учимся программировать на языке C++!";
}
Вся проблема в том, что в книге говорится: заголовочный файл iostream будет использоваться в каждой программе, но о stdafx.h ничего не сказано. А без него программа не собирается! Плюс к тому что std:: нужно указать перед cout в книге так же не написано, а без этого появляется ошибка.
Выходит что либо книга у меня старая, либо автор упускает некоторые моменты
оператор #include
Это не оператор, это директива. Давайте общаться на грамотном языке.
2.
он подгружает в программу заголовочные файлы
Он не подгружает, а включает. Это разные вещи. А включать он может двумя способами:
- #include <filename>. Включает файл filename, расположенный по стандартному пути, определенному переменной среды Include;
- #include "filename". Включает файл filename, расположенный в той же директории, что и файл, в котором эта директива встретилась.
приводит к ошибке.
3.
заголовочный файл iostream будет использоваться в каждой программе
Абсолютный бред. iostream присутствует только там, где требуется решать задачи потокового ввода / вывода.
4.
о stdafx.h ничего не сказано. А без него программа не собирается
stdafx.h - это файл, который по умолчанию генерируется студией. Если бы вы послушали мой совет и создали пустой консольный проект, у вас бы не возникло этой проблемы.
5. Наконец, пару слов по поводу версий компилятора. В старых версиях не было файла iostream, был только файл iostream.h. Кроме того, пространство имен std было доступно по умолчанию, поэтому писать std:: перед cout было действительно не нужно. В новых версиях ситуация изменилась так, как я описал в предыдущем посте.
Кроме того, вы должны хорошо понимать, что MS VC++ - это всего лишь одна из реализаций C++, и не нужно намертво к ней привязываться. Когда читаете литературу и пробуете что-то писать, вникайте и разбирайтесь, какие моменты относятся непосредственно к языку, а какие - к его конкретной реализации.
забыл сказать. чтобы не писать везде std:: можно прописать using namespace std; перед void main(void).
я так и сделал. спасибо
тут нашел топик про std - cyberforum.ru/cpp-beginners/thread102120.html
подключил. все работает
Назначение данного файла несколько иное, ибо сие есть "precompiled header".
Для начала, его лучше научить создавать пустой консольный проект.
Остается только синий фон Visual C++ 2010 и снизу несколько вкладок: вывод, окно команд, список ошибок
Спасибо.
Вписал такой код:
#include <iostream>
int main()
{
std::cout << "Hello, world!" << std::endl;
return 0;
}
проект не запускается :(
1>LINK : error LNK2001: неразрешенный внешний символ "_mainCRTStartup"
1>c:\users\admin\documents\visual studio 2010\Projects\mycod\Debug\mycod.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
После чего создавай в нём файл main.cpp (или как ты хочешь его назвать, разрешение только .cpp оставь) с таким содержанием:
using namesapce std;
void main()
{
cout << "Hello world!" << endl;
cin.get();
}
Проекты Win32\CLR\MFC и т.д. пока не трогай, там будет автоматически создаваться некоторое кол-во кода, которое тебе не нужно сейчас.
Вписал такой код:
#include <iostream>
int main()
{
std::cout << "Hello, world!" << std::endl;
return 0;
}
проект не запускается :(
1>LINK : error LNK2001: неразрешенный внешний символ "_mainCRTStartup"
1>c:\users\admin\documents\visual studio 2010\Projects\mycod\Debug\mycod.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Ты опять создал Win32-проект вместо консольного.
Возник один вопрос - чем отличаются эти коды (которые в принципе выполняют одно и то же, но написаны по разному):
using namesapce std;
int main()
{
cout << "Hello, world!" << endl;
return 0;
}
using namesapce std;
void main()
{
std::cout << "Hello world!" << endl;
cin.get();
}
using namesapce std;
void main(void)
{
cout << "Hello world!";
}
В каждой книге по разному
Хорошо ли писать using namespace std; в заголовочных файлах? Если нет, то почему?
Можно это как-то поподробнее ? Совершенно не понял написанное )
:)
нет возможности читать pdf и djvu, т.к. редко нахожусь дома. читаю все что смогу найти
если знаете где это на странице сайта онлайн можно почитать - буду очень признателен :)
Как писали ранее в этом топике, что VS вставляет шаблон по умолчанию если создан не пустой проект.
Возникло несколько вопросов:
1. Если мне нужно создать приложение Windows form, то можно ли его создать из пустого проекта ? В смысле: можно как-то добавить саму форму, элементы на нее ?
2. Если нет, то может быть можно как-то удалить шаблон из Windows Form ?
Мне понадобилась утилитка, которая записывает в каждую 8ю строку ту, которую я ей указал.
Если писать консольное, то нужно как-то из двух .тхт файлов все реализовывать. В одном вписана та строка которую нужно вставить, а в другом сама база в которую и будем вносить строку из первой .тхт. Думаю нужно будет воспользоваться \n, но как не на следующую перенести а на 8ю с его помощью. И наверно данные нужно писать в массив, тольео не знаю как примерно организовать. Не прошу код утилиты, просто направьте на правильный путь :)
[QUOTE=noob c++]
Мне понадобилась утилитка, которая записывает в каждую 8ю строку ту, которую я ей указал.
[/QUOTE]
Поясни.
...
В одном вписана та строка которую нужно вставить, а в другом сама база в которую и будем вносить строку из первой .тхт. Думаю нужно будет воспользоваться \n, но как не на следующую перенести а на 8ю с его помощью. Не прошу код утилиты, просто направьте на правильный путь :)
R b.txt
d
}' a.txt
Тут как бы дело не в том консольные или нет. Просто winforms - это .Net
И это уже не C++. При этом managed С++ (или как он там сейчас называется C++/CLI) далеко не лучший инструмент, чтобы изучить .Net, и уж точно очень плохой способ изучить C++.
:facepalm:
Qt, и не только под "винду".
И это уже не C++. При этом managed С++ (или как он там сейчас называется C++/CLI) далеко не лучший инструмент, чтобы изучить .Net, и уж точно очень плохой способ изучить C++.
То есть на чистом с++ нельзя создать графическую оболочку ? Нужно подключить Net или Qt ?
Как я понимаю Qt это прменение к с++ Netframework ? Сейчас по учебникам с++ штурмую, пока все более-менее понятно :)
R b.txt
d
}' a.txt
Синтаксис какой-то странный )
Главное что это работает из коробки и легко решает задачу :)
#include <fstream>
ofstream out;
out.("file.type"); //открываем файл
if (in==NULL) return 0; //если не смогли открыть файл, какая-либо ошибка
in<<"this string was wrote to file by c++;)"<<endl; //записываем в файл
Как здесь указать что нужно писать именно в 8ю строку ? И вообще возможно возможно ли так сделать или нужно построить как-то иначе ?
aks::)
А вообще,есть ещё WinAPI,на нём всё и построено.MFC–это своеобразная обёртка,и от неё сейчас вроде как уходят