Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

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; просмотров: 387.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...