Статьи

С ++ Кратко: Visual Studio и C ++

Если вы используете практически любое из сопоставлений клавиатуры Visual Studio, нажатие клавиш Ctrl + J вызовет IntelliSense. В Visual Studio 2012 IntelliSense должен автоматически отображаться в C ++. В Visual Studio 2010 и более ранних версиях его необходимо вызывать вручную.


Фрагменты кода — это новая функция для C ++ в Visual Studio 2012. Они не существовали в более ранних версиях. Если вы никогда не использовали их ни на одном языке, то в проекте C # начните вводить «for», чтобы начать цикл for; Как только IntelliSense выберет фрагмент кода for, дважды нажмите клавишу Tab и посмотрите, как цикл for выглядит заполненным автоматическими полями, которые можно редактировать. Используйте клавишу Tab для переключения между полями. Когда вы закончите редактирование полей, нажмите Enter. Курсор будет перемещен в теле цикла с внесенными вами правками в виде обычного текста.

Фрагменты кода особенно хороши для операторов switch, которые включают перечисление, так как они автоматически заполняют оператор switch всеми членами перечисления.


В C ++ обычно недостаточно просто включить заголовочный файл. Обычно вы должны указать компоновщику ссылаться на библиотеку, которая реализует код, объявленный в заголовочном файле. Для этого вам нужно отредактировать свойства проекта, доступные в меню Project как ProjectName Properties …

В свойствах в разделе «Свойства конфигурации»> «Компоновщик»> «Ввод» одним из полей является «Дополнительные зависимости». Это разделенный точкой с запятой список .LIB-файлов, с которыми необходимо связать. Он должен заканчиваться на% (AdditionalDependencies), так что будут добавлены любые дополнительные библиотеки, связанные через MS Build.

Например, для типичной игры в стиле Metro DirectX 11 вы можете увидеть следующее:

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

Если вы хотите просмотреть очень близкое приближение кода ассемблера, в который компилируется ваш код, в свойствах вашего проекта в разделе Свойства конфигурации> C / C ++> Выходные файлы установите для параметра Вывод ассемблера значение, отличное от Нет в списке.

Я бы порекомендовал либо листинг только для сборки (/ FA), либо сборку с исходным кодом (/ FA). В списке «Только сборка» содержится достаточное количество комментариев к номеру строки, которые обычно можно ссылаться на файлы исходного кода, чтобы увидеть, какой код C ++ соответствует коду сборки. Это может быть полезно, если вы хотите, чтобы все видели в одном месте, а не переключались между тем, что вы открывали .ASM-файл (я использую Notepad ++), и Visual Studio.

Обратите внимание, что созданная сборка использует макросы MASM (найдите их в MSDN). Если вы не знаете, что означает конкретная инструкция по сборке (например, LEA), вы можете найти ее в Интернете или загрузить соответствующее руководство по программированию с сайта Intel (предположим, x86 / Itanium), сайта AMD (предположим, x64) или ARM Holding. сайт (при условии ARM). Если вы никогда не изучали какую-либо сборку, я определенно рекомендую это сделать (попробуйте создать простое приложение для консоли Windows).

Понимание сборки дает вам лучшее понимание того, как компьютеры действительно работают внутри. Объедините это со знанием того, что на всех компьютерах есть аппаратные средства, чтобы начать выполнять один и тот же код каждый раз, когда они включены (традиционно BIOS на ПК, хотя теперь его заменяет UEFI), и загадка того, как и почему компьютеры работают быстро, начинается исчезать.


Если вы столкнетесь с ошибкой сборки, которая выглядит совершенно ужасно, скорее всего, это от компоновщика. Вы увидите такие сообщения, например:

Все, что говорит, это то, что он не может найти функцию, которую, как вы сказали, должен быть в состоянии найти. В этом случае я добавил ключевое слово inline в определение функции конструктора в файле CPP, не забывая переместить это определение в файл заголовка. Любые встроенные функции должны быть в заголовке, чтобы компоновщик не ненавидел вас.

Все эти ?? и @@ ands — это то, как C ++ искажает имена, когда компилирует код в объектные файлы. Упорядочивание имен является внутренне согласованным для рассматриваемого компилятора, но стандарт ISO / IEC не требует какой-либо конкретной схемы для искажения имен. Различные компиляторы могут и часто будут манипулировать вещами по-разному.

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

Примером этого является предыдущий случай: моя SomeClass::SomeClass(wchar_t const *) (я всегда пишу тип const, а не тип const, поэтому даже этот бит восстанавливается).

Если это чужая функция или другой символ, скорее всего, вы не сообщили компоновщику о файле .LIB, который его содержит.

В .NET вы просто добавляете ссылку на сборку, чтобы получить как биты объявления, так и фактическое определение в одном. В C ++ декларация является файлом заголовка, а код определения, за исключением встроенного кода, который также должен быть в файле заголовка, находится в отдельной библиотеке. Найдите в библиотеке MSDN отсутствующий символ и найдите имя файла библиотеки, который нужно добавить.

Ошибки сборки C ++ могут выглядеть довольно страшно, особенно когда вы получаете ошибку сборки, связанную с шаблоном. Это может заставить вас бросить курить. Но не надо. Никогда не позволяйте ужасным сообщениям об ошибках побеждать. Сначала выясните, идет ли он от компилятора (он будет иметь формат номера ошибки C ####) или от компоновщика (формат номера ошибки LNK ####).

Если из компилятора, это обычно означает синтаксическую ошибку. Проверьте, например, забыли ли вы #pragma в верхней части заголовочного файла. Другая проблема может быть в том, что вы используете что-то из стандартной библиотеки (например, endl ), но забыли иметь #using namespace std; или префикс его с помощью std :: (т.е. std::endl ).

Вы можете сделать одно или оба, но вы должны сделать хотя бы один. Некоторые вещи могут быть в другом пространстве имен. Например, в Visual Studio 2010 некоторые функции находятся в пространстве имен stdext. То же самое касается любых пространств имен в вашем собственном коде.

Если вам не повезло в одиночку, перейдите в MSDN и введите первую часть сообщения об ошибке. Вы, вероятно, найдете несколько полезных ссылок на обсуждения на форумах MSDN, StackOverflow, возможно, статью MSDN или сообщение в блоге MSDN — возможно, даже сама страница с кодом ошибки будет иметь подсказку, которая вам нужна. Если ничего не помогло, опубликуйте вопрос на сайте форума: MSDN, соответствующий сайт StackExchange или App Hub.

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

Если вы занимаетесь разработкой на C ++, то Visual Studio — это, безусловно, IDE (интегрированная среда разработки), которую стоит рассмотреть. Он может предложить гораздо больше, чем то, что описано в этой статье, поэтому я советую вам попробовать и изучить его широкий спектр функций.

Этот урок представляет собой главу из C ++ Succinctly , бесплатной книги от команды Syncfusion .