ЯЗЫК СИ. Си что это


СИ - это... Что такое СИ?

СИ

«Социальная инициатива»

корпорация

СИ

суточный индекс

кардиология

мед.

СИ

система иммунитета

Источник: http://expo.rusmedserv.com/articl3.html

СИ

«Сигнальная информация»

выпуск ВИНИТИ

СИ

Социалистический интернационал, Социнтерн

  1. социсследование
  2. СИ

социологическое исследование

СИ

сбор информации

Источник: http://www.sniip.ru/0005.htm

СИ

синхротронное излучение

Словарь: С. Фадеев. Словарь сокращений современного русского языка. — С.-Пб.: Политехника, 1997. — 527 с.

СИ

система измерений

Словарь: С. Фадеев. Словарь сокращений современного русского языка. — С.-Пб.: Политехника, 1997. — 527 с.

СИ

смешивающий искатель

СИ

систолический индекс

Словарь: С. Фадеев. Словарь сокращений современного русского языка. — С.-Пб.: Политехника, 1997. — 527 с.

СИ

система индикации

Словарь: С. Фадеев. Словарь сокращений современного русского языка. — С.-Пб.: Политехника, 1997. — 527 с.

СИ

международная система единиц

англ.: SI, International System of Units

англ., ед. изм.

Словари: Словарь сокращений и аббревиатур армии и спецслужб. Сост. А. А. Щелоков. — М.: ООО «Издательство АСТ», ЗАО «Издательский дом Гелеос», 2003. — 318 с., С. Фадеев. Словарь сокращений современного русского языка. — С.-Пб.: Политехника, 1997. — 527 с.

  1. Си
  2. сим
  3. См

Сименс

ед. изм.

  1. Си

Словарь: С. Фадеев. Словарь сокращений современного русского языка. — С.-Пб.: Политехника, 1997. — 527 с.

  1. См

Словарь: С. Фадеев. Словарь сокращений современного русского языка. — С.-Пб.: Политехника, 1997. — 527 с.

СИ

фирма «Социнновация»

СИ

сердечный индекс

мед.

СИ

средство измерения

чаще - средства

Словарь: С. Фадеев. Словарь сокращений современного русского языка. — С.-Пб.: Политехника, 1997. — 527 с.

СИ

стратегический инвестор

Словарь: С. Фадеев. Словарь сокращений современного русского языка. — С.-Пб.: Политехника, 1997. — 527 с.

  1. СИ
  2. СИЗО

следственный изолятор

  1. СИЗО

Словари: Словарь сокращений и аббревиатур армии и спецслужб. Сост. А. А. Щелоков. — М.: ООО «Издательство АСТ», ЗАО «Издательский дом Гелеос», 2003. — 318 с., С. Фадеев. Словарь сокращений современного русского языка. — С.-Пб.: Политехника, 1997. — 527 с.

СИ

синхроимпульс

электр.

техн.

Словарь: С. Фадеев. Словарь сокращений современного русского языка. — С.-Пб.: Политехника, 1997. — 527 с.

СИ

стендовые испытания

СИ

«Самиздат»

журнал; сервер

http://samlib.ru/​

издание, сетевое

СИ

совместное использование

например: диапазон радиочастот СИ

Источник: http://www.gazpromenergoinform.ru/news/2010/11/silovye-struktury-s-2012-g-budut-platit-za-radiochastoty-sovmestnogo-ispolzovania-smi.aspx

СИ

средство индивидуализации

например: СИ юридических лиц, товаров, услуг и предприятий

мн. ч.

Источник: http://www.nanonewsnet.ru/news/2010/kak-otsenit-intellektualnuyu-sobstvennost

СИ

световая индикация

СИ

спецификация изделия

СИ

строчный импульс

техн.

СИ

синхронизирующий импульс

мн. ч., связь

СИ

стереоизображение

Источник: http://www.oilcapital.ru/technologies/2007/12/181203_117720.shtml

СИ

служебное извещение

Источник: http://www.garant.ru/hotlaw/files/f15103.rtf?mail

СИ

средства информатизации

СИ

«Северное измерение»

природоохранное партнёрствоср.: ППСИ; ПОПСИ

организация

Источник: http://www.kremlin.ru/events/articles/2006/11/114316/114365.shtml

СИ

«Свидетели Иеговы»

секта

Источник: http://www.dvinainform.ru/news/2006/05/05/42806.shtml

СИ

«Своя игра»

телепередача

Источник: http://www.tvgameclub.com/showthread.php?postid=10754

СИ

строительная информатика

кафедра МГСУ

образование и наука

Источник: http://www.mgsu.ru/DIR00/3623.htm

СИ

станция инжиниринга

Источник: http://www.krug2000.ru/press.phtml?view=ispat_karmet

СИ

средства инициирования

Источник: http://www.npf-geofizika.ru/leuza/gti/sokr.htm

СИ

система индексирования

Источник: http://www.islu.ru/k_inform/glossary.html

Словарь сокращений и аббревиатур. Академик. 2015.

sokrasheniya.academic.ru

Разница между Си и Си++

Б. Страуструп называл С++ поначалу как "С с классами". Т. е. С++ это С с возможностью разработки объектно-ориентированного кода. Практически все, что есть в С, заложено и в С++. Но за дополнительные возможности приходится платить. Поэтому объектный и исполнимый код на С, откомпилированный компилятором С++, как правило, тяжелее и неповоротливее, чем такой же, но полученный С-компилятором. И там, где компактность приложения и скорость его работы критична, там без колебаний отказываются от возможностей ООП и используют С вместо С++.

Почти совсем верно. На самом деле "плюшек" исчезло очень мало, и то в большинстве компиляторов они вставлены и в C++, хотя и не входят в его стандарт. Различия (не расширения) посмотри, например, тут: <a rel="nofollow" href="http://www.c-cpp.ru/books/razlichie-mezhdu-s-i-s" target="_blank">http://www.c-cpp.ru/books/razlichie-mezhdu-s-i-s</a> Я бы добавил еще VLA (Variable Length Array), не включенные в стандарт C++, хотя по факту, как и всё остальное, они часто допускаются компиляторами.

&gt; за объектно-ориентированность пришлось заплатить меньшей гибкостью Ни разу не пришлось. Никто не мешает писать на С++ приложения хоть вообще без ООП, либо применять ООП только когда считается нужнм. Точно так же можно использовать всю сишную библиотеку и вообще смешивать Си и С++ как кажется нужным, в т. ч. в пределах одного проекта и даже файла исходного кода. Вот в C# и Java - ООП обязательно, и библиотека может использоваться только своя, а библиотека Си или С++ использоваться не может. --- Синтаксис у всех ЯП - достаточно прост, и в общих чертах не отличается. Везде есть условия, циклы, функции (или хотя бы goto) и т. д. Различия же начинаются на уровне: массивов, циклов, структур, классов, пространств имен, типов значений... То есть на уровне того, что относится не столько к синтаксису. сколько к ПЛАТФОРМЕ И БИБЛИОТЕКЕ языка. И еще больше различий - на уровне платформы и библиотек в общепринятом смысле слова. Главное в любом ЯП - именно библиотеки (то есть наборы готовых функций, классов и т. д., используемых при написании программ) - как стандартная библиотека, так и альтернативные и сторонные. Критерий заточенности реализации ЯП для конкретных целей и вообще актуальности ЯП - именно наличие и качество библиотек. И главное развитие между Си и С++ -опять же в библиотеках. На Си невозможно работать с .NET и сторонними .NET-библиотеками. На Си невозможно работать с Qt (во всяком случае, полноценно). На Си невозможно работать с VCL. Список можно продолжать. И это и есть главная причина не использовать Си под виндой, а использовать С++.

"С++" по определению включает в себя "С" и все плюшки из С можно использовать в С++, хотя многие не рекомендуются. И прога на "С" годится в "С++" НО!! У них идеология разная! в С вообще нет понятия объекта -он на функциях. Так что никаких классов и методов. Ближайшее в Сиплюсовому классу там "структура". но в ней в принципе не предусмотрено методов. это просто способ объединения разнородных данных без углубления дальше. Соответственно там и сами структуры прог строятся по разному. Хотя в С++ часто используются фишки из С. И даже наследуется синтаксис.

UPD: &gt; это тот же Си, только улучшенный Не улучшенный и точка, а лучше подходящий для БОЛЬШИНСТВА стандартных ЦЕЛЕЙ ВЫСОКОУРОВНЕВОЙ РАЗРАБОТКИ. В низкоуровневой разработке Си по-прежнему удобнее и мощнее, а где-то вообще вне конкуренции, так как компиляторов каких-то других ЯП под ту платформу просто нет. Рейтинги такого типа просто абсурдны. Из них можно лишь узнать, на чем пишет больший процент, а на чем меньший, из общего числа программистов. Но у разных программистов задачи разные. И если китайских программистов, пишущих прошивки для тамагочи на Си или каком-нибудь брейнфаке, оказывается, больше, чем десктопных программистов на С++ (хотя б потому что китайцев вообще больше, чем многих других народов вместе взятых), то из этого никак не следует, что ВАМ на ДЕСКТОПЕ лучше использовать Си или брейнфак.

С++ предлагает свою парадигму программирования. Принимать ее тебе или нет - определяется твоими целями и работатодателем. Лучше это или хуже определять только после досконального изучения. Писать в процедурном стиле можно и в С++.Накоплены обширные библиотеки кода С, которые можно использовать и в С++.Короткие и утилитарные функции можно писать по старинке, на С, поэтому таких программистов больше.

где + там лучше

C++ это таже С, только с ООП. Так уж получилось что после функциональной сишки, программеров на ООП потянуло, вот из С и появились такие языки как С++ или Objective-C. На обоих этих языках можно писать обычный сишный код.

C++ более гибкий чем C. В C++ есть классы, объекты, в C только структуры.

touch.otvet.mail.ru

ЯЗЫК СИ - это... Что такое ЯЗЫК СИ?

  • ЯЗЫК — языка (языка книжн. устар., только в 3, 4, 7 и 8 знач.), м. 1. Орган в полости рта в виде подвижного мягкого выроста, являющийся органом вкуса, а у человека способствующий также образованию звуков речи. Коровий язык. Больно прикусить язык. Лизать …   Толковый словарь Ушакова

  • ЯЗЫК — муж. мясистый снаряд во рту, служащий для подкладки зубам пищи, для распознанья вкуса ее, а также для словесной речи, или, у животных, для отдельных звуков. Коровий язык, лизун; рыбий, тумак; змеиный, жало, вилка; песий, лопата; кошачий, терка.… …   Толковый словарь Даля

  • ЯЗЫК — знаковая система, используемая для целей коммуникации и познания. Системность Я. выражается в наличии в каждом Я., помимо словаря, также с и н таксиса и семантики. Синтаксис определяет правила образования выражений Я. и их преобразования,… …   Философская энциклопедия

  • язык — Говор, наречие, диалект; слог, стиль; народ. См. народ притча во языцех См. шпион владеть языком, воздержный на язык, говорить языком кого либо, держать язык за зубами, держать язык на веревочке, держать язык на привязи, закусить язык, злой язык …   Словарь синонимов

  • Язык —     ЯЗЫК. Термин Я. по отношению к человеческой речи употребляется в разных значениях: 1. для обозначения человеческого Я. вообще, как способности говорить; 2. для обозначения отдельного Я., в отличие от наречия и говора или диалекта; 3. для… …   Словарь литературных терминов

  • ЯЗЫК — говяжий, телячий, свиной, бараний в свежем или солёном виде используют для приготовления холодных и горячих блюд. Перед варкой язык следует хорошо промыть, а солёный вымочить в холодной воде: крупный 5 6 часов, небольшой 2 3 часа. Язык отварной.… …   Краткая энциклопедия домашнего хозяйства

  • ЯЗЫК — 1) естественный язык, важнейшее средство человеческого общения. Язык неразрывно связан с мышлением; является социальным средством хранения и передачи информации, одним из средств управления человеческим поведением. Язык возник одновременно с воз …   Большой Энциклопедический словарь

  • Язык —  Язык  ♦ Langage, Langue    В широком смысле – всякая коммуникация посредством знаков (именно таким «языком» обладают, например, пчелы). В строгом, или специфически человеческом, смысле – способность к говорению (потенциальный язык) или все… …   Философский словарь Спонвиля

  • ЯЗЫК — ЯЗЫК, 1) естественный язык, важнейшее средство человеческого общения. Язык неразрывно связан с мышлением; является социальным средством хранения и передачи информации, одним из средств управления человеческим поведением. Реализуется и существует… …   Современная энциклопедия

  • ЯЗЫК — слишком важная вещь, чтобы доверять его языковедам. Ольгерд Терлецкий Язык это диалект, обладающий собственной армией и флотом. Макс Вайнрайх Немецкий язык в сущности богат, но в немецкой разговорной речи мы пользуемся только десятой долей этого… …   Сводная энциклопедия афоризмов

  • ЯЗЫК — (language) Суть политики состоит в борьбе принципов и теорий общества. Поэтому язык для политики – то же, что кислород для атмосферы: язык является особым, исключительно важным компонентом политики. Восприятие политических реалий формируется… …   Политология. Словарь.

  • dic.academic.ru

    С++ - это... Что такое С++?

    Проект под названием STLport[2], основанный на SGI STL, осуществляет постоянное обновление STL, IOstream и строковых классов. Некоторые другие проекты также занимаются разработкой частных применений стандартной библиотеки для различных конструкторских задач. Каждый производитель компиляторов Си++ обязательно поставляет какую-либо реализацию этой библиотеки, так как она является очень важной частью стандарта и широко используется.

    Объектно-ориентированные особенности языка

    Си++ добавляет к Си объектно-ориентированные возможности. Он вводит классы, которые обеспечивают три самых важных свойства ООП: инкапсуляцию, наследование и полиморфизм.

    Существует два значения слова класс. В широком смысле класс — это пользовательский тип, объявленный с использованием одного из ключевых слов class, struct или union. В узком смысле класс — это пользовательский тип, объявленный с использованием ключевого слова class.

    Инкапсуляция

    Основным способом организации информации в Си++ являются классы. В отличие от типа структура (struct) языка Си, которая может состоять только из полей и вложенных типов, класс (class) Си++ может состоять из полей, вложенных типов и функций-членов (member functions). Члены класса бывают публичными (открытыми, public), защищёнными (protected) и собственными (закрытыми, приватными, private). В Си++ тип структура аналогичен типу класс, отличие в том, что по умолчанию члены и базовые классы у структуры публичные, а у класса — собственные.

    С открытыми (публичными) членами класса можно делать снаружи класса всё, что угодно. К закрытым (приватным) членам нельзя обращаться извне класса, чтобы не нарушить целостность данных класса. Попытка такого обращения вызовет ошибку компиляции. К таким членам могут обращаться только функции-члены класса (а также так называемые функции-друзья и функции-члены классов-друзей; о понятии друзей в C++ см. ниже). Помимо открытых и закрытых членов класса, могут быть ещё и защищённые — это члены, доступные содержащему их классу, его друзьям, а также производным от него классам. Такая защита членов называется инкапсуляцией.

    Используя инкапсуляцию, автор класса может защитить свои данные от некорректного использования. Кроме того, она задумывалась для облегчения совместной разработки классов. Имелось в виду, что при изменении способа хранения данных, если они объявлены как защищённые или собственные, не требуется соответствующих изменений в классах, которые используют изменённый класс. Например, если в старой версии класса данные хранились в виде линейного списка, а в новой версии — в виде дерева, те классы, которые были написаны до изменения формата хранения данных, переписывать не потребуется, если данные были приватными или защищёнными (в последнем случае — если использующие классы не были классами-наследниками), так как ни один из них этих классов не мог бы напрямую обращаться к данным, а только через стандартные функции, которые в новой версии должны уже корректно работать с новым форматом данных. Даже оператор доступа operator [] может быть определён как такая стандартная функция.

    Используя инкапсуляцию, структуру Array из предыдущего раздела можно переписать следующим образом:

    class Array { public: void Alloc(int new_len); void Free(); inline double Elem(int i); inline void ChangeElem(int i, double x); protected: int len; double* val; }; void Array::Alloc(int new_len) {if (len>0) Free(); len=new_len; val=new double[new_len];} void Array::Free() {delete [] val; len=0;} inline double Array::Elem(int i) {assert(i>=0 && i<len ); return val[i];} inline void Array::ChangeElem(int i, double x) {assert(i>=0 && i<len); val[i]=x;}

    И далее

    Array a; a.Alloc(10); a.ChangeElem(3, 2.78); double b = a.Elem(3); a.Free();

    Здесь массив a имеет 4 публичных функции-члена и 2 защищённых поля. Описатель inline означает подсказку компилятору, что вместо вызова функции её код следует подставить в точку вызова, чем иногда можно достичь большей эффективности.

    Описание функций в теле класса

    В теле класса можно указать только заголовок функции, а можно описать всю функцию. Во втором случае она считается встраиваемой (inline), например:

    class Array { public: void Alloc(int _len) {if (len==0) Free(); len=_len; val=new double[len];}

    и так далее.

    Конструкторы и деструкторы

    Однако в приведённом примере не решена важная проблема: функции Alloc и Free по-прежнему надо вызывать вручную. Другая проблема данного примера — опасность оператора присваивания.

    Для решения этих проблем в язык были введены конструкторы и деструкторы. Конструктор вызывается каждый раз, когда создаётся объект данного типа; деструктор — при уничтожении. При преобразованиях типов с участием экземпляров классов тоже вызываются конструкторы и деструкторы.

    С конструкторами и деструктором класс выглядит так:

    class Array { public: Array() : len(0), val(NULL) {} Array(int _len) : len(_len) {val = new double[_len];} Array(const Array& a); ~Array() { Free(); } inline double Elem(int i); inline void ChangeElem(int i, double x); protected: void Alloc(int _len); void Free(); int len; double* val; }; Array::Array(const Array& a) : len(a.len) { val = new double[len]; for (int i=0; i<len; i++) val[i] = a.val[i]; }

    Здесь Array::Array — конструктор, а Array::~Array — деструктор. Конструктор копирования (copy constructor) Array::Array(const Array&) вызывается при создании нового объекта, являющегося копией уже существующего объекта. Теперь объект класса Array нельзя испортить: как бы мы его ни создавали, что бы мы ни делали, его значение будет хорошим, потому что конструктор вызывается автоматически. Все опасные операции с указателями спрятаны в закрытые функции.

    Array a(5); // вызывается Array::Array(int) Array b; // вызывается Array::Array() Array c(a); // вызывается Array::Array(const Array&) Array d=a; // то же самое b=c; // происходит вызов оператора = // если он не определён (как в данном случае), то вызывается оператор присваивания по умолчанию, который // осуществляет копирование базовых подобъектов и почленное копирование нестатических членов-данных. // как правило конструктор копий и оператор присваивания переопределяются попарно

    Оператор new тоже вызывает конструкторы, а delete — деструкторы.

    По умолчанию, каждый класс имеет неявно объявленные конструктор без параметров, копирующий конструктор, копирующий оператор присваивания и деструктор.

    Класс может иметь сколько угодно конструкторов (с разными наборами параметров), но только один деструктор (без параметров).

    Другие возможности функций-членов

    Функции-члены могут быть и операциями:

    class Array { ... inline double &operator[] (int n) { return val[n]; }

    И далее

    Array a(10); ... double b = a[5];

    Функции-члены (и только они) могут иметь описатель const

    class Array { ... inline double operator[] (int n) const;

    Такие функции не имеют права изменять поля класса (кроме полей, определённых как mutable). Если они пытаются это сделать, компилятор должен выдать сообщение об ошибке.

    Наследование

    Для создания классов с добавленной функциональностью вводят наследование. Класс-наследник имеет поля и функции-члены базового класса, но не имеет права обращаться к собственным (private) полям и функциям базового класса. В этом и заключается разница между собственными и защищёнными членами.

    Класс-наследник может добавлять свои поля и функции или переопределять функции базового класса.

    По умолчанию, конструктор наследника без параметров вызывает конструктор базового класса, а затем конструкторы нестатических членов-данных, являющихся экземплярами классов. Деструктор работает в обратном порядке. Другие конструкторы приходится определять каждый раз заново. К счастью, это можно сделать вызовом конструктора базового класса.

    class ArrayWithAdd : public Array { ArrayWithAdd(int n) : Array(n) {} ArrayWithAdd() : Array() {} ArrayWithAdd(const Array& a) : Array(a) {} void Add(const Array& a); };

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

    Наследование бывает публичным, защищённым и собственным. При публичном наследовании, публичные и защищённые члены базового класса сохраняют свой статус, а к собственным не могут обращаться даже функции-члены наследника. Защищённое наследование отличается тем, что при нём публичные члены базового класса являются защищёнными членами наследника. При собственном наследовании все члены базового класса становятся собственными членами класса-наследника. Таким образом, пользователь производного класса не может обращаться к членам базового класса, даже если они объявлены как публичные. Класс-наследник делает их собственными с помощью собственного наследования. Как правило, публичное наследование встречается значительно чаще других.

    Класс может быть наследником нескольких классов. Это называется множественным наследованием. Такой класс обладает полями и функциями-членами всех его предков. Например, класс FlyingCat (ЛетающийКот) может быть наследником классов Cat (Кот) и FlyingAnimal (ЛетающееЖивотное)

    class Cat { ... void Purr(); ... }; class FlyingAnimal { ... void Fly(); ... }; class FlyingCat : public Cat, public FlyingAnimal { ... PurrAndFly() {Purr(); Fly();} ... };

    Полиморфизм

    Полиморфизмом в программировании называется переопределение наследником функций-членов базового класса, например

    class Figure { ... void Draw() const; ... }; class Square : public Figure { ... void Draw() const; ... }; class Circle : public Figure { ... void Draw() const; ... };

    В этом примере, какая из функций будет вызвана — Circle::Draw(), Square::Draw() или Figure::Draw(), определяется во время компиляции. К примеру, если написать

    Figure* x = new Circle(0,0,5); x->Draw();

    то будет вызвана Figure::Draw(), поскольку x — объект класса Figure. Такой полиморфизм называется статическим.

    Но в C++ есть и динамический полиморфизм, когда вызываемая функция определяется во время выполнения. Для этого функции-члены должны быть виртуальными.

    class Figure { ... virtual void Draw() const; ... }; class Square : public Figure { ... virtual void Draw() const; ... }; class Circle : public Figure { ... virtual void Draw() const; ... }; Figure* figures[10]; figures[0] = new Square(1, 2, 10); figures[1] = new Circle(3, 5, 8); ... for (int i = 0; i < 10; i++) figures[i]->Draw();

    В этом случае для каждого элемента будет вызвана Square::Draw() или Circle::Draw() в зависимости от вида фигуры.

    Чисто виртуальной функцией называется функция-член, которая объявлена со спецификатором = 0:

    class Figure { ... virtual void Draw() const = 0; );

    Чисто виртуальная функция может быть оставлена без определения, кроме случая, когда требуется произвести её вызов. Абстрактным классом называется такой, у которого есть хотя бы одна чисто виртуальная функция-член. Объекты таких классов создавать запрещено. Абстрактные классы часто используются как интерфейсы.

    Друзья

    Функции-друзья — это функции, не являющиеся функциями-членами и тем не менее имеющие доступ к защищённым и собственным полям и функциям-членам класса. Они должны быть описаны в теле класса как friend. Например:

    class Matrix { ... friend Matrix Multiply(Matrix m1, Matrix m2); ... }; Matrix Multiply(Matrix m1, Matrix m2) { ... }

    Здесь функция Multiply может обращаться к любым полям и функциям-членам класса Matrix.

    Существуют также классы-друзья. Если класс A — друг класса B, то все его функции-члены могут обращаться к любым полям и функциям членам класса B. Например:

    class Matrix { ... friend class Vector; ... };

    Однако в С++ не действует правило «друг моего друга — мой друг».

    По стандарту C++03 вложенный класс не имеет прав доступа к закрытым членам объемлющего класса и не может быть объявлен его другом (последнее следует из определения термина друг как нечлена класса). Тем не менее, многие широко распространённые компиляторы нарушают оба эти правила (по всей видимости, ввиду совокупной странности этих правил).

    Будущее развитие

    Текущий стандарт языка был принят в 2003 году. Следующая версия стандарта носит неофициальное название C++0x.

    Си++ продолжает развиваться, чтобы отвечать современным требованиям. Одна из групп, занимающихся языком Си++ в его современном виде и направляющих комитету по стандартизации Си++ советы по его улучшению — это Boost. Например, одно из направлений деятельности этой группы — совершенствование возможностей языка путём добавления в него особенностей метапрограммирования.

    Стандарт Си++ не описывает способы именования объектов, некоторые детали обработки исключений и другие возможности, связанные с деталями реализации, что делает несовместимым объектный код, созданный различными компиляторами. Однако для этого третьими лицами создано множество стандартов для конкретных архитектур и операционных систем.

    Тем не менее (по состоянию на время написания этой статьи) среди компиляторов Си++ всё ещё продолжается битва за полную реализацию стандарта Си++, особенно в области шаблонов — части языка, совсем недавно полностью разработанной комитетом стандартизации.

    Ключевое слово export

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

    Первым компилятором, поддерживающим export в шаблонах, стал Comeau C++ в начале 2003 года (спустя пять лет после выхода стандарта). В 2004 году бета-версия компилятора Borland C++ Builder X также начала его поддержку.

    Оба этих компилятора основаны на внешнем интерфейсе EDG. Другие компиляторы, такие как Microsoft Visual C++ или GCC (GCC 3.4.4), вообще этого не поддерживают. Герб Саттер (англ.), секретарь комитета по стандартизации Си++, рекомендовал убрать export из будущих версий стандарта по причине серьёзных сложностей в полноценной реализации, однако впоследствии окончательным решением было решено его оставить.

    Из списка других проблем, связанных с шаблонами, можно привести вопросы конструкций частичной специализации шаблонов, которые плохо поддерживались в течение многих лет после выхода стандарта Си++.

    Си++ не включает в себя Си

    Несмотря на то что большая часть кода Си будет справедлива и для Си++, Си++ не является надмножеством Си и не включает его в себя. Существует и такой верный для Си код, который неверен для Си++. Это отличает его от Объектного Си, ещё одного усовершенствования Си для ООП, как раз являющегося надмножеством Си.

    Например, следующий фрагмент кода корректен с точки зрения Си, но некорректен с точки зрения Си++:

    typedef struct mystr { int a; int b; } mystr;

    Дело в том, что в Си идентификаторы структур (теги структур), то есть идентификаторы, используемые при описании структуры в качестве имени структуры, являются сущностями отдельного вида, имеющими обособленное пространство имён, тогда как в Си++ идентификатор структуры представляет собой попросту её тип. Таким образом, в языке Си вышеприведённый фрагмент вводит структуру mystr и новый тип mystr, тогда как в Си++ этот же фрагмент будет воспринят как попытка дважды описать тип с именем mystr.

    Другим источником несовместимости являются добавленные ключевые слова. Так, описание переменной

    является вполне корректным для Си, но заведомо ошибочным для Си++, поскольку слово try является в Си++ ключевым.

    Существуют и другие различия. Например, Си++ не разрешает вызывать функцию main() внутри программы, в то время как в Си это действие правомерно. Кроме того, Си++ более строг в некоторых вопросах; например, он не допускает неявное приведение типов между несвязанными типами указателей и не разрешает использовать функции, которые ещё не объявлены.

    Более того, код, верный для обоих языков, может давать разные результаты в зависимости от того, компилятором какого языка он оттранслирован. Например, на большинстве платформ следующая программа печатает «С», если компилируется компилятором Си, и «С++» — если компилятором Си++. Так происходит из-за того, что символьные константы в Си (например 'a') имеют тип int, а в Си++ — тип char, а размеры этих типов обычно различаются.

    #include <stdio.h> int main() { printf("%s\n", (sizeof('a') == sizeof(char)) ? "C++" : "C"); return 0; }

    Примеры программ на Си++

    Пример № 1

    Это пример программы, которая не делает ничего. Она начинает выполняться и немедленно завершается. Она состоит из основного потока: функции main(), которая обозначает точку начала выполнения программы на Си++.

    Стандарт Си++ требует, чтобы функция main() возвращала тип int. Программа, которая имеет другой тип возвращаемого значения функции main(), не соответствует стандарту Си++.

    Стандарт не говорит о том, что на самом деле означает возвращаемое значение функции main(). Традиционно оно интерпретируется как код возврата программы. Стандарт гарантирует, что возвращение 0 из функции main() показывает, что программа была завершена успешно.

    Завершение программы на Си++ с ошибкой традиционно обозначается путём возврата ненулевого значения.

    Пример № 2

    Эта программа также ничего не делает, но более лаконична.

    В Си++, если выполнение программы доходит до конца функции main(), то это эквивалентно return 0;. Это неверно для любой другой функции кроме main().

    Пример № 3

    Это пример программы Hello World, которая выводит это знаменитое сообщение, используя стандартную библиотеку, и завершается.

    #include <iostream> // это необходимо для std::cout и std::endl int main() { std::cout << "Hello, world!" << std::endl; }

    Пример № 4

    Современный Си++ позволяет решать простым способом и более сложные задачи. Этот пример демонстрирует кроме всего прочего использование контейнеров стандартной библиотеки шаблонов (STL).

    #include <iostream> // для использования std::cout #include <vector> // для std::vector<> #include <map> // для std::map<> и std::pair<> #include <algorithm> // для std::for_each() #include <string> // для std::string using namespace std; // используем пространство имён "std" void display_item_count(pair< string const, vector<string> > const& person) { // person - это пара двух объектов: person.first - это его имя, // person.second - это список его предметов (вектор строк) cout << person.first << " is carrying " << person.second.size() << " items" << endl; } int main() { // объявляем карту со строковыми ключами и данными в виде векторов строк map< string, vector<string> > items; // Добавим в эту карту пару человек и дадим им несколько предметов items["Anya"].push_back("scarf"); items["Dimitri"].push_back("tickets"); items["Anya"].push_back("puppy"); // Переберём все объекты в контейнере for_each(items.begin(), items.end(), display_item_count); }

    В этом примере для простоты используется директива использования пространства имён, в настоящей же программе обычно рекомендуется использовать объявления, которые аккуратнее директив:

    #include <vector> int main() { using std::vector; vector<int> my_vector; }

    Здесь директива помещена в область функции, что уменьшает шансы столкновений имён (это и стало причиной введения в язык пространств имён). Использование объявлений, сливающих разные пространства имён в одно, разрушает саму концепцию пространства имён.

    Сравнение C++ с языками Java и C#

    Целью создания C++ было расширение возможностей Си, наиболее распространённого языка системного программирования. Ориентированный на ту же самую область применения, C++ унаследовал множество не самых лучших, с теоретической точки зрения, особенностей Си. Перечисленные выше принципы, которых придерживался автор языка, предопределили многие недостатки C++.

    В области прикладного программирования альтернативой C++ стал его язык-потомок, Майкрософт предложила язык C#, представляющий собой ещё одну переработку C++ в том же направлении, что и Java. В дальнейшем появился язык функционального программирования. Ещё позже появилась попытка объединения эффективности C++ с безопасностью и скоростью разработки C# — был предложен язык D, который пока не получил широкого признания.

    Java и C++ можно рассматривать как два языка-потомка Си, разработанных из различных соображений и пошедших, вследствие этого, по разным путям. В этой связи представляет интерес сравнение данных языков (всё, сказанное ниже про Java, можно с равным успехом отнести к языкам C# и Nemerle, поскольку в рассматриваемых деталях эти языки отличаются лишь внешне).

    Синтаксис  C++ сохраняет совместимость с C, насколько это возможно. Java сохраняет внешнее подобие C и C++, но, в действительности, сильно отличается от них — из языка удалено большое число синтаксических средств, признанных необязательными. В результате Java гораздо проще C++, что облегчает как изучение языка, так и создание трансляторов для него. Исполнение программы  Java-код компилируются в промежуточный код, который в дальнейшем интерпретируется или компилируется, тогда как C++ изначально ориентирован на компиляцию в машинный код заданной платформы (хотя, теоретически, ничто не мешает создавать для C++ трансляторы в промежуточный код). Это уже определяет разницу в сферах применения языков: Java вряд ли может быть использована при написании таких специфических программ, как драйвера устройств или низкоуровневые системные утилиты. Механизм исполнения Java делает программы, даже откомпилированные (в байт-код) полностью переносимыми. Стандартное окружение и среда исполнения позволяют выполнять программы на Java на любой аппаратной платформе и в любой ОС, без каких-либо изменений, усилия по портированию программ минимальны (при соблюдении рекомендаций по созданию переносимых программ — и вовсе нулевые). Ценой переносимости становится потеря эффективности — работа среды исполнения приводит к дополнительным накладным расходам. Управление памятью  C++ следует классической технике управления памятью, когда программист, выделяя динамически память под объекты, обязан позаботиться о своевременном её освобождении. Java работает в среде со сборкой мусора, которая автоматически отслеживает прекращение использования объектов и освобождает занимаемую ими память. Первый вариант предпочтительнее в системном программировании, где требуется полный контроль программиста над используемыми программой ресурсами, второй удобнее в прикладном программировании, поскольку в значительной степени освобождает программиста от необходимости отслеживать момент прекращения использования ранее выделенной памяти. Сборщик мусора Java требует системных ресурсов, что также снижает эффективность выполнения программ. Стандартизация окружения  В Java есть чётко определённые стандарты на ввод-вывод, графику, геометрию, диалог, доступ к базам данных и прочим типовым приложениям. C++ в этом отношении гораздо более свободен. Стандарты на графику, доступ к базам данных и т. д. являются недостатком, если программист хочет определить свой собственный стандарт. Указатели  C++ сохраняет возможность работы с низкоуровневыми указателями. В Java указателей нет. Использование указателей часто является причиной труднообнаруживаемых ошибок, но необходимо для низкоуровневого программирования. В принципе, C++ обладает набором средств (конструкторы и деструкторы, стандартные шаблоны, ссылки), позволяющих почти полностью исключить выделение и освобождение памяти вручную и опасные операции с указателями. Однако такое исключение требует определённой культуры программирования, в то время как в языке Java оно реализуется автоматически. Парадигма программирования  Язык Java является чисто объектно-ориентированным, тогда как C++ сохраняет возможности чисто процедурного программирования (свободные функции и переменные). Динамическая информация о типах  В C++ отсутствует полноценная информации о типах во время исполнения RTTI. Эту возможность можно было бы реализовать в C++, имея полную информацию о типах во время компиляции CTTI. Препроцессор  C++ сохранил препроцессор Си, в том числе возможность введения пользовательского синтаксиса с помощью #define. Этот механизм небезопасен, он может привести к тому, что модули в крупных пакетах программ становятся сильно связаны друг с другом, что резко понижает надёжность пакетов и возможность организации разделённых модулей. С++ предоставляет достаточно средств (константы, шаблоны, встроенные функции) для того, чтобы практически полностью исключить использование #define. Java просто исключила препроцессор полностью, избавившись разом от всех проблем с его использованием, хотя и потеряв при этом некоторые возможности.

    Отличия языков приводят к ожесточённым спорам между сторонниками двух языков о том, какой язык лучше. Споры эти во многом беспредметны, поскольку сторонники Java считают различия говорящими в пользу Java, а сторонники C++ полагают обратное. Некоторая аргументация устаревает со временем, например, упрёки в неэффективности Java из-за наличия среды исполнения, бывшие справедливыми в первой половине 1990-х годов, в результате лавинообразного роста производительности компьютеров и появления более эффективной техники исполнения (

    Далеко не все программисты являются сторонниками одного из языков. По мнению большинства программистов, Java и C++ не являются конкурентами, потому что обладают различными областями применимости. Другие считают, что выбор языка для многих задач является вопросом личного вкуса.

    Достоинства и недостатки языка

    Прежде всего, необходимо подчеркнуть, что оценивать достоинства и, в особенности, недостатки С++ необходимо в контексте тех принципов, на которых строился язык, и требований, которые к нему изначально предъявлялись.

    Достоинства

    C++ — чрезвычайно мощный язык, содержащий средства создания эффективных программ практически любого назначения, от низкоуровневых утилит и драйверов до сложных программных комплексов самого различного назначения. В частности:

    • Высокая совместимость с языком С, позволяющая использовать весь существующий С-код (код С может быть с минимальными переделками скомпилирован компилятором С++; библиотеки, написанные на С, обычно могут быть вызваны из С++ непосредственно без каких-либо дополнительных затрат, в том числе и на уровне функций обратного вызова, позволяя библиотекам, написанным на С, вызывать код, написанный на С++).
    • Поддерживаются различные стили и технологии программирования, включая традиционное директивное программирование, ООП, обобщенное программирование, метапрограммирование (шаблоны, макросы).
    • Имеется возможность работы на низком уровне с памятью, адресами, портами.
    • Возможность создания обобщённых контейнеров и алгоритмов для разных типов данных, их специализация и вычисления на этапе компиляции, используя шаблоны.
    • Кроссплатформенность. Доступны компиляторы для большого количества платформ, на языке C++ разрабатывают программы для самых различных платформ и систем.
    • Эффективность. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы. Ни одна из языковых возможностей, приводящая к дополнительным накладным расходам, не является обязательной для использования — при необходимости язык позволяет обеспечить максимальную эффективность программы.

    Недостатки

    Отчасти недостатки C++ унаследованы от языка-предка — Си, — и вызваны изначально заданным требованием возможно большей совместимости с Си. Это такие недостатки, как:

    • Синтаксис, провоцирующий ошибки:
      • Операция присваивания обозначается как = , а операция сравнения как ==. Их легко спутать, при этом операция присваивания возвращает значение, поэтому присваивание на месте выражения является синтаксически корректным, а в конструкциях цикла и ветвления появление числа на месте логического значения также допустимо, так что ошибочная конструкция оказывается синтаксически правильной. Типичный пример подобной ошибки: if (x=0) { операторы } Здесь в условном операторе по ошибке написано присваивание вместо сравнения. В результате, вместо того, чтобы сравнить текущее значение x с нулём, программа присвоит x нулевое значение, а потом интерпретирует его как значение условия в операторе if. Так как нуль соответствует логическому значению «ложь» (false), блок операторов в условной конструкции не выполнится никогда. Ошибки такого рода трудно выявлять, но во многих современных компиляторах предлагается диагностика некоторых подобных конструкций.
      • Операции присваивания (=), инкрементации (++), декрементации (--) и другие возвращают значение. В сочетании с обилием операций это позволяет, хотя и не обязывает, создавать трудночитаемые выражения. Наличие этих операций в Си было вызвано желанием получить инструмент ручной оптимизации кода, но в настоящее время оптимизирующие компиляторы обычно генерируют оптимальный код и на традиционных выражениях. С другой стороны, один из основных принципов языков C и C++ — позволять программисту писать в любом стиле, а не навязывать «хороший» стиль.
      • Макросы (#define) являются мощным, но опасным средством. Они сохранены в C++ несмотря на то, что необходимость в них, благодаря шаблонам и встроенным функциям, не так уж велика. В унаследованных стандартных С-библиотеках много потенциально опасных макросов.
      • Некоторые преобразования типов неинтуитивны. В частности, операция над беззнаковым и знаковым числами выдаёт беззнаковый результат.
      • Необходимость записывать break в каждой ветви оператора switch и возможность последовательного выполнения нескольких ветвей при его отсутствии провоцирует ошибки из-за пропуска break. Эта же особенность позволяет делать сомнительные «трюки», базирующиеся на избирательном неприменении break и затрудняющие понимание кода.
    • Препроцессор, унаследованный от С, очень примитивен. Это приводит с одной стороны к тому, что с его помощью нельзя (или тяжело) осуществлять некоторые задачи метапрограммирования, а с другой, вследствие своей примитивности, он часто приводит к ошибкам и требует много действий по обходу потенциальных проблем. Некоторые языки программирования (например, Nemerle) имеют намного более мощные и более безопасные системы метапрограммирования (также называемые макросами, но мало напоминающие макросы С/С++).
    • Плохая поддержка модульности (по сути, в классическом Си модульность на уровне языка отсутствует, её обеспечение переложено на компоновщик). Подключение интерфейса внешнего модуля через препроцессорную вставку заголовочного файла (#include) серьёзно замедляет компиляцию при подключении большого количества модулей (потому что результирующий файл, который обрабатывается компилятором, оказывается очень велик). Эта схема без изменений скопирована в C++. Для устранения этого недостатка, многие компиляторы реализуют механизм прекомпиляции заголовочных файлов Precompiled Headers.

    К собственным недостаткам C++ можно отнести:

    • Сложность и избыточность, из-за которых C++ трудно изучать, а построение компилятора сопряжено с большим количеством проблем. В частности:
      • В языке практически полностью сохранён набор конструкций Си, к которому добавлены новые средства. Во многих случаях новые средства и механизмы позволяют делать то же самое, что и старые, но в языке сохраняются оба варианта.
      • Поддержка множественного наследования реализации в ООП-подсистеме языка вызывает целый ряд логических проблем, а также создаёт дополнительные трудности в реализации компилятора.
      • Шаблоны в своём исходном виде приводят к порождению кода очень большого объёма, а введённая позже в язык возможность частичной спецификации шаблонов трудно реализуема и не поддерживается многими существующими компиляторами.
    • Недостаток информации о типах данных во время компиляции (CTTI).
    • Метапрограммирование на основе шаблонов C++ сложно и при этом ограничено в возможностях. Оно состоит в реализации средствами шаблонов C++ интерпретатора примитивного функционального языка программирования выполняющегося во время компиляции. Сама по себе данная возможность весьма привлекательна, но такой код весьма трудно воспринимать и отлаживать. Языки Lisp/Nemerle и некоторые другие имеют более мощные и одновременно более простые для восприятия подсистемы метапрограммирования. Кроме того, в языке D реализована сравнимая по мощности, но значительно более простая в применении подсистема шаблонного метапрограммирования.
    • Хотя декларируется, что С++ мультипарадигменный язык, реально в языке отсутствует поддержка функционального программирования. Отчасти, данный пробел устраняется различными библиотеками (Boost) использующими средства метапрограммирования для расширения языка функциональными конструкциями (например, поддержкой лямбд/анонимных методов), но качество подобных решений значительно уступает качеству встроенных в функциональные языки решений. Такие возможности функциональных языков, как сопоставление с образцом, вообще крайне сложно эмулировать средствами метапрограммирования.
    • Некоторые считают недостатком языка C++ отсутствие встроенной системы сборки мусора. С другой стороны, в C++ имеется достаточно средств, позволяющих почти исключить использование опасных указателей, нет принципиальных проблем и в реализации и использовании сборки мусора (на уровне библиотек, а не языка). Отсутствие встроенной сборки мусора позволяет пользователю самому выбрать стратегию управления ресурсами.

    Примечания

    См. также

    Ссылки

    Статьи и книги, библиотеки материалов по C++ Форумы
    • codeby.net C, С++ и С Builder. Белорусский форум по C++
    • www.rsdn.ru/forum/?group=cpp — форум по C++ на
      • Bloodshed Dev-C++ (сайт) — бесплатная и свободная среда разработки в C++ под Windows.
      • (сайт) — бесплатная и свободная кроссплатформенная среда разработки.
      • Blitz++ — библиотека научных программ на C++, с упором на линейную алгебру
      • The Matrix Template Library — линейная алгебра на C++
      • Boost C++ Libraries — свободные кроссплатформенные библиотеки на C++
      • GNU Scientific Library — свободная математическая библиотека для C/C++, распространяемая на условиях лицензии GNU General Public License.
      • The C++ Standards Committee
      • VivaCore — свободная библиотека для создания систем статического анализа Си/Си++ кода [1].
      • сайт) — бесплатная открытая библиотека для создания своего пользовательского интерфейса.
      • сайт) — ещё одна библиотека создания кроссплатформенных приложений, бесплатная для некоммерческого использования.

      Литература

      • Страуструп Б. Язык программирования C++. Специальное издание = The C++ programming language. Special edition. — М.: Бином-Пресс, 2007. — 1104 с. — ISBN 5-7989-0223-4
      • Герберт Шилдт. Полный справочник по C++ = C++: The Complete Reference. — 4-е изд. — М.: Вильямс, 2006. — 800 с. — ISBN 0-07-222680-3
      • Джесс Либерти, Дэвид Хорват. Освой самостоятельно C++ за 24 часа = Sams Teach Yourself C++ in 24 Hours, Complete Starter Kit. — 4-е изд. — М.: Вильямс, 2007. — 448 с. — ISBN 0-672-32681-7
      • Стефенс Д. Р. C++. Сборник рецептов. — КУДИЦ-ПРЕСС, 2007. — 624 с. — ISBN 5-91136-030-6

    dic.academic.ru

    Препроцессор Си - это... Что такое Препроцессор Си?

    Препроцессор С/С++ — программный инструмент, изменяющий код программы для последующей компиляции и сборки, используемый в языках программирования Си и его потомка - C++. Этот препроцессор обеспечивает использование стандартного набора возможностей:

    Важной областью применения препроцессоров С является условная компиляция. При подготовке программы к компиляции разработчик может с помощью нескольких изменений адаптировать программу к текущей ситуации (например, к определенной модели процессора).

    Препроцессор языка Си — низкоуровневый, лексический препроцессор, потому что он требует только лексического анализа, то есть он обрабатывает только исходный текст перед парсингом, выполняя простую замену лексем и специальных символов заданными последовательностями символов, в соответствии с правилами, установленными пользователями.

    Директивы

    Директивой препроцессора (или командной строкой препроцессора[1]) называется строка в исходном коде, которая начинается с символа # и следующего за ним ключевого слова препроцессора. Есть чётко определённый список ключевых слов:

    • define — задаёт макроопределение (макрос) или символическую константу
    • undef — отменяет предыдущее определение
    • include — вставляет текст из указанного файла
    • if — осуществляет условную компиляцию при истинности константного выражения
    • ifdef — осуществляет условную компиляцию при определённости символической константы
    • ifndef — осуществляет условную компиляцию при неопределённости символической константы
    • else — ветка условной компиляции при ложности выражения
    • endif — конец ветки условной компиляции
    • line — препроцессор изменяет номер текущей строки и имя компилируемого файла
    • error — выдача диагностического сообщения
    • pragma — действие, зависящее от конкретной реализации компилятора
    • пустое слово - пустое действие.

    Функции

    Включение

    Препроцессор Си, встречая следующие директивы:

    или

    полностью копирует содержимое указанного файла в файл, в котором указана эта директива, в месте вызова директивы. Эти файлы обычно содержат определение интерфейса для различных функций библиотек и типов данных, которые должны быть подключены перед их использованием; таким образом, директива #include обычно указывается в начале (заголовке) файла. По этой причине подключаемые файлы и называются заголовочными. Некоторые содержат примеры из стандартной библиотеки Си (<math.h> и <stdio.h>), обеспечивая математические функции и функции ввода-вывода соответственно.

    При использовании препроцессора одновременно с упрощением использования кода его использование несколько замедляет написание кода из-за недостаточной эффективности и требует дополнительного использования условной компиляции для предотвращения множественных включений указанного заголовочного файла.

    Начиная с 1970-х среди программистов все большее распространение и известность получают альтернативные способы переиспользования подключения файлов, применяемых в большинстве языков программирования: Java и Common Lisp используют пакеты, Паскаль использует юниты (единицы), Modula, OCaml, Haskell и Python используют модули, а D, разработанный как замена языков Си и C++, использует импорт.

    Макросы

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

    Например,

    #define max(a,b) ((a) > (b) ? (a) : (b))

    определяет макрос max, использующий два аргумента a и b. Этот макрос можно вызывать как любую Си-функцию, используя схожий синтаксис. То есть, после обработки препроцессором,

    становится

    z = ((x) > (y) ? (x) : (y));

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

    Например, если f и g — две функции, вызов

    не вычислит один раз f()и один раз g(), и поместит наибольшее значение в z, как этого можно было ожидать. Вместо этого одна из функций будет вычислена дважды. Если функция имеет побочные эффекты, то вероятно, что её поведение будет отличаться от ожидаемого.

    Макросы Си могут походить на функции, создавая новый синтаксис в некоторых пределах, а также могут быть дополнены произвольным текстом (хотя компилятор Си требует, чтобы текст был без ошибок написанным Си-кодом или оформлен как комментарий), но у них есть некоторые ограничения как у программных конструкций. Макросы, схожие с функциями, например, могут быть вызваны как «настоящие» функции, но макрос не может быть передан другой функции при помощи указателя, по той причине, что макрос сам по себе не имеет адреса.

    Некоторые современные языки обычно не используют такой способ метапрограммирования с использованием макросов как дополнений строк символов, в расчете или на автоматическое или на ручное подключение функций и методов, а вместо этого другие способы абстракции, такие как шаблоны, общие функции или параметрический полиморфизм. В частности, встраиваемые функции позволяют избежать одного из главных недостатков макросов в современных версия Си и C++, так как встроенная функция обеспечивает преимущество макросов в снижении накладных расходов при вызове функции, но её адрес можно передавать в указателе для косвенных вызовов или использовать в качестве параметра. Аналогично, проблема множественных вычислений, упомянутая выше в макросе max, для встроенных функций неактуальна.

    Условная компиляция

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

    В общем случае, программисту необходимо использовать конструкцию наподобие этой:

    #ifndef FOO_H #define FOO_H ...(код заголовочного файла)... #endif

    Такая «защита макросов» предотвращает двойное подключение заголовочного файла путем проверки существования этого макроса, который имеет то же самое имя, что и заголовочный файл. Определение макроса FOO_H происходит, когда заголовочный файл впервые обрабатывается препроцессором. Затем, если этот заголовочный файл вновь подключается, FOO_H уже определен, в результате чего препроцессор пропускает полностью текст этого заголовочного файла.

    То же самое можно сделать, включив в заголовочный файл директиву:

    Условия препроцессора можно задавать несколькими способами, например:

    #ifdef x ... #else ... #endif

    или

    #if x ... #else ... #endif

    Этот способ часто используется в системных заголовочных файлах для проверки различных возможностей, определение которых может меняться в зависимости от платформы; например, библиотека Glibc использует макросы с проверкой особенностей с целью проверить, что операционная система и оборудование их (макросы) корректно поддерживает при неизменности программного интерфейса.

    Большинство современных языков программирования не используют такие возможности, больше полагаясь на традиционные операторы условия if...then...else..., оставляя компилятору задачу извлечения бесполезного кода из компилируемой программы.

    Примечания

    Ссылки

    dic.academic.ru


    Видеоматериалы

    24.10.2018

    Опыт пилотных регионов, где соцнормы на электроэнергию уже введены, показывает: граждане платить стали меньше

    Подробнее...
    23.10.2018

    Соответствует ли вода и воздух установленным нормативам?

    Подробнее...
    22.10.2018

    С начала года из ветхого и аварийного жилья в республике были переселены десятки семей

    Подробнее...
    22.10.2018

    Столичный Водоканал готовится к зиме

    Подробнее...
    17.10.2018

    Более 10-ти миллионов рублей направлено на капитальный ремонт многоквартирных домов в Лескенском районе

    Подробнее...

    Актуальные темы

    13.05.2018

    Формирование энергосберегающего поведения граждан

     

    Подробнее...
    29.03.2018

    ОТЧЕТ о деятельности министерства энергетики, ЖКХ и тарифной политики Кабардино-Балкарской Республики в сфере государственного регулирования и контроля цен и тарифов в 2012 году и об основных задачах на 2013 год

    Подробнее...
    13.03.2018

    Предложения организаций, осуществляющих регулируемую деятельность о размере подлежащих государственному регулированию цен (тарифов) на 2013 год

    Подробнее...
    11.03.2018

    НАУЧИМСЯ ЭКОНОМИТЬ В БЫТУ

     
    Подробнее...

    inetpriem

    
    << < Ноябрь 2013 > >>
    Пн Вт Ср Чт Пт Сб Вс
            1 2 3
    4 5 6 7 8 9 10
    11 12 13 14 15 16 17
    18 19 20 21 22 23 24
    25 26 27 28 29 30  

    calc

    banner-calc

    .