Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Int MyNameSpace::Func(float fx)
{ // операторы return 1; }
В пространстве имен могут присутствовать любые синтаксически допустимые объявления и определения. Объявление пространства имен может быть сделано в двух областях: · глобальной, т.е. вне функций или классов; · в другом пространстве имен.
Доступ к именам заданного пространства имен можно осуществлять тремя способами. Во-первых, с помощью квалифицированныхимен, например: int iK=MyNameSpace::Func(1.23); cout<<MyNameSpace::iNumber; int iNumber=123;// другая переменная
Квалифицированные имена можно использовать везде в области их видимости, в том числе в других пространствах имен.
Во-вторых, с использованием объявлений using (using declaration): using MyNameSpace::iNumber; using MyNameSpace::Func;// скобки не нужны!
Эти объявления также могут употребляться в любых местах, в том числе в других пространствах имен. Теперь в области видимости этого объявления употребление имен iNumber или Func эквивалентно использованию квалифицированных имен MyNameSpace::iNumber и MyNameSpace::Func, но более лаконично.
Третий способ доступа к именам, объявленным в пространстве MyNameSpace, заключается в использовании директивы using (using directive): using namespace MyNameSpace; using namespace A,B; //ошибка: нельзя указывать два и более пространства имен
Теперь в области действия этой директивы можно использовать все имена из пространства MyNameSpace без указания квалификаторов или объявлений using. Имена, объявленные в пространстве имен, могут быть перекрыты другими объявлениями, например: // … using MyNameSpace; int iNumber=1; Void main() { int iNumber=2; cout<<iNumber; // 2 cout<<::iNumber; // 1 cout<< MyNameSpace::iNumber; // 0 } В языке допускается также использовать неименованные пространства имен (unnamed namespaces), например: #include “SomeHeader.h” Namespace { int iNumber; int Func(float); } Ясно, что неименованное пространство имен может быть только одно в транслируемой единице и к его членам нельзя получить доступ из другой транслируемой единицы. Смысл использования неименованного пространства имен состоит в том, чтобы сделать объявленные в нем имена недоступными из других мест программы. Нельзя перекрывать имена, объявленные в неименованном пространстве имен: Namespace { int iNumber, Legal; } // … int iNumber;// допустимо, пока не используется Void SomeFunc() { iNumber=123;// error C2872: 'iNumber' : ambiguous symbol int Legal; // допустимо }
Возможно также использовать псевдонимы пространств имен, например, с целью сокращения длинных имен: namespace MyNameSpace {}; namespace MNS = MyNameSpace;
Теперь имя MNS можно использовать наряду с именем MyNameSpace.
Объединение пространств имен: namespace First {/**/ } namespace Second {/**/ } Namespace Common { using namespace First; using namespace Second; /**/ }
После таких объявлений имена пространств First и Second доступны через Common. Пространства имен можно расширять, например: Namespace OpenSpace { void Func1(); } // здесь Func1 является членом пространства OpenSpace. Namespace OpenSpace { void Func2(); } // здесь Func1 и Func2 является членом пространства OpenSpace.
Расширение пространства имен может быть сделано в разных файлах. Более детальное рассмотрение пространств имен см. у Б.Страуструпа [3].
Макросы и отладка В данном разделе освещены наиболее актуальные вопросы применения макросов библиотеки MFC для разработки и отладки программ. За более подробными сведениями обращайтесь к разделу «Using Macros for Verification and Reporting» MSDN. Макрос TRACE TRACE(выражение); Макрос работает только в отладочной версии приложения (Debug) и не работает в окончательной (Release), чем он, собственно, и удобен. В качестве параметров макроса могут использоваться такие же параметры, как и в стандартных функциях printf(). Таким образом, этот макрос можно использовать для отладочного вывода, который нет необходимости удалять из окончательной версии программы. Макрос, в отличие от printf(), осуществляет вывод в окно Debug.
// пример для TRACE int nCount = 1; char sz[] = "one"; TRACE( "Count = %d, Description = %s\n", nCount, sz ); // Вывод в окно Debug: ' Count = 1, Description = one'
Ниже приведены форматные спецификации, которые применяются в С-функциях семейства print и их же можно использовать в макросе TRACE. Для конкретности ниже приведено описание наиболее часто используемой функции printf. Прототип этой функции следующий: int printf(const char *format [,argument]... );
Как видно из прототипа, функция имеет только один обязательный параметр format и произвольное число необязательных параметров (аргументов). Функция возвращает число выведенных символов или -1 в случае ошибки. Например, функция printf (”Value of pi equal %f\n”, pi); выведет Value of pi equal 3.141593
Форматная строка может содержать: · непосредственно печатаемые символы; · спецификации преобразования; · управляющие символы.
Каждому аргументу соответствует своя спецификация преобразования: %d, %i – десятичное целое число; %f – число с плавающей точкой; %e,%E – число с плавающей точкой в экспоненциальной форме; %u – десятичное число в беззнаковой форме; %c – символ; %s – строка символов.
В форматную строку также могут входить управляющие символы: \n – управляющий символ новая строка; \t – табуляция; \a – звуковой сигнал и др.
Также в форматной строке могут использоваться модификаторы формата, которые управляют шириной поля, отводимого для размещения выводимого значения. Модификаторы – это числа, которые указывают минимальное количество позиций для вывода значения аргумента и количество позиций для вывода дробной части числа: %[-]m[.p]C где - – задает выравнивание по левому краю, m – минимальная ширина поля, p – количество цифр после запятой для чисел с плавающей точкой и минимальное количество выводимых цифр для целых чисел (если цифр в числе меньше, чем значение р, то выводятся начальные нули), С – спецификация преобразования (d, i, f и т.д.).
Еще один пример. Функция printf("\nFormat specifications:\n%10.5d - integer,” “ \n %10.5f - floating-point \n “ “%10.5e” – scientific format (exponential form)\n” “%10s - string", 10, 10.0, 10.0, "abc");
выведет
Format specifications: 00010 – integer 10.00000 – floating-point 1.00000е+001 - scientific format (exponential form) abc – string
Объект afxDump
Это альтернатива TRACE, более подходящая языку C++. MFC-объект afxDump принимает переменные из программы с использованием синтаксиса, аналогичного C++-синтаксису объекта потокового вывода cout. Применение сложных форматных строк не требуется — вместо этого формат вывода управляется переопределяемыми операторами. Вывод afxDump направляется туда же, куда и вывод TRACE (т.е. в окно Debug ИС MVS), но объект afxDump определен только в отладочной версии MFC-библиотеки. Вот типичный потоко-ориентированный диагностический оператор, который дает тот же результат, что и приведенный выше макрос TRACE: int nCount = 9; CString strDesc("total"); #ifdef _DEBUG afxDump << "Count = " << nCount << ", Description = " << strDesc << "\n"; #endif // _DEBUG
Хотя и afxDump и cout используют один и тот же оператор вставки в поток (<<), код их реализации различен. Объект cout является частью библиотеки iostream Visual C++, a afxDump — частью MFC-библиотеки. Не думайте, что какие-то возможности форматирования, предоставляемые cout, доступны при работе с afxDump. Классы, не производные от CObject, такие, как CTime и CRect, имеют свои переопределенные операторы вставки для объектов CDumpContext. Класс CDumpContext, экземпляром которого является afxDump, включает переопределенные операторы вставки для базовых типов C++ (int, double, char" и т. д.). Кроме того, в нем есть переопределенные операторы для ссылок и указателей на CObject — они-то и представляют для нас особый интерес.
|
||
Последнее изменение этой страницы: 2018-04-12; просмотров: 435. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |