Программирование >>  Перегруженные имена функций и идентификаторы 

1 ... 167 168 169 [ 170 ] 171 172 173 ... 210


I mov dx,1

I int 21h

и т.д.

Другой способ - компилировать с ключом -B. Правда, при этом могут возникнуть другие проблемы: если присутствуют имена read и read (например), то компилятор в них запутается.

Б1ло замечено, что борланд (3.1, например) иногда генерит разный код в зависимости от ключа -B. Как правило, при его наличии он становится осторожнее - начинает понимать, что не он один использует регистры.

Возврат адреса/ссылки локальных переменных - почему возвращает фигню:

char* myview() { char s[SIZE]; ... return s; }

Нужно поставить static char s[SIZE]; чтобы возвращался адрес всегда существующей (статической) переменной, а автоматические переменные исчезают при выходе из функции - освобождается и может быть замусорено место из-под этих переменных на стеке.

Какие ограничения на имена с подчёркиванием?

При использовании зарезервированных имён (то есть с подчёркиваниями) возможен самый разный undefined behavior. Например, в компиляторе все слова с двойным подчёркиванием могут использоваться для управления файловой системой. Именно поэтому вполне допустимо (по стандарту), если Борланд в своём компиляторе, например, при встрече нестандартной

лексемы asm из сорца дя VC++ просто потрёт какой-нибудь

файл. На практике такого рода вариации undefined behavior встретить сложно, но вполне возможно.

Другие вариации undefined behavior - это всякие глюки при работе программы. То есть, если мы, например, в printf задействуем неизвестный библиотеке (нестандартный) флаг, то по стандарту вполне допустимо не проверять в библиотеке подобную фигню и передать управление куда-нибудь в область даннгх (ну нет в таблице переходов такого флага!).

Поведение переменных, описанных в заголовке цикла for

Переменная, объявленная в заголовке цикла (и прочих операторов!) действительна только внутри этого цикла.



Тем, кто хочет заставить вести себя также свои старые компилеры, это можно сделать следующим способом через define:

В новых редакциях C++ область видимости определённой в заголовке for переменной ограничивают телом цикла. Следующая подстановка ограничивает область видимости и для старых редакций, в которых она распространяется за пределы цикла:

#define for if(0);else for а также для BC++ выключим вызываемые if(0) предупреждения:

Condition is always false #pragma warn -ccc

Что есть const после имени метода?

Это означает, что этот метод не будет менять данные класса.

Методы с модификатором const могут изменять данные объекта, помеченные модификатором mutable.

class Bart {

private:

mutable int m iSomething; public:

void addToSomething( int iValue ) const

m iSomething += iValue;

Bart()

m iSomething = 0;

const Bart bartObject; bartObject.addToSomething( 8 ); Будет скомпилировано и выполнено.

Как инициализировать статические члены класса?

struct a { static int i; };

int a::i; зачем это нужно?

int main() { a::i = 11; return 0; }

А вот зачем:

struct b { int n; b(int i) :n(i) {} };

struct a { static b i; };



b a::i(0);

int main() { printf( %i\n ,a::i.n); return 0; } Описание некоего типа и переменная этого типа - не одно и то же. Где вы предлагаете размещать и конструировать статические поля? Может быть, в каждом файе, который включает заголовок с описанием класса? Или где?

Как не ошибиться в размере аллокируемого блока?

Для избежания подобного можно в Си сымитировать Сиплюсный new:

#define tmalloc(type) ((type*)malloc(sizeof(type))) #define amalloc(type, size) ((type*)malloc(sizeof(type) *

(size)))

Более того, в последнем define можно поставить (size) + 1, чтобы гарантированно избежать проблем с завершающим нулём в строках.

Можно сделать иначе. Поскольку присвоение от malloc() как правило делают на типизованную переменную, то можно прямо так и написать:

body = malloc(sizeof(*body)); теперь спокойно можно менять типы не заботясь о malloc(). Но это верно для Си, который не ругается на присвоение void* к type* (иначе пришлось бы кастить поинтер, и компилятор изменения типа просто не пережил бы).

Вообще в C нет смысла ставить преобразования от void* к указательному типу явно. Более того, этот код не переносим на C++ - в проекте стандарта C++ нет malloc() и free(), их нет даже в hosted С++ заголовках. Проще будет:

#ifdef cplusplus

# define tmalloc(type) (new type)

# define amalloc(type, size) (new type[size]) #else

# define tmalloc(type) malloc(sizeof(type))

# define amalloc(type, size) malloc(sizeof(type) * (size)) #endif

Что такое ссылка?

Ссылка - это псевдоним (другое имя) для объекта.

Ссылки часто используются для передачи параметра по ссылке:



1 ... 167 168 169 [ 170 ] 171 172 173 ... 210

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика