|
Программирование >> Перегруженные имена функций и идентификаторы
Можно ли задавать начальные значения объединений? Стандарт ANSI допускает инициализацию первого члена объединения. Не существует стандартного способа инициализации других членов (и тем более нет такого способа для старых компиляторов, которые вообще не поддерживают какой-либо инициализации). Как передать функции структуру, у которой все члены - константы? Поскольку в языке Си нет возможности создавать безымянные значения структурного типа, необходимо создать временную структуру. Какой тип целочисленной переменной использовать? Если могут потребоваться большие числа, (больше 32767 ии меньше -32767), используйте тип long. Если нет, и важна экономия памяти (большие массивы или много структур), используйте short. Во всех остальных случаях используйте int. Если важно точно определить момент переполнения и/или знак числа не имеет значения, используйте соответствующий тип unsigned. (Но будьте внимательны при совместном использовании типов signed и unsigned в выражениях). Похожие соображения применимы при выборе между float и double. Хотя тип char или unsigned char может использоваться как целочисленный тип наименьшего размера, от этого больше вреда, чем пользы из-за непредсказуемгх перемен знака и возрастающего размера программы. Эти правила, очевидно, не применимы к адресам переменных, поскольку адрес должен иметь совершенно определенный тип. Если необходимо объявить переменную определенного размера, (единственной причиной тут может быть попытка удовлетворить внешним требованиям к организации памяти), непременно изолируйте объявление соответствующим typedef. Каким должен быть новый 64-битный тип на новых 64-битных машинах? Некоторые поставщики Си компиляторов для 64-битных машин поддерживают тип long int длиной 64 бита. Другие же, опасаясь, что слишком многие уже написанные программы зависят от sizeof(int) == sizeof(long) == 32 бита, вводят новый 64-битный тип long long (или longlong). Программисты, желающие писать мобильные программы, должны, следовательно, изолировать 64-битные типы с помощью средства typedef. Разработчики компиляторов, чувствующие необходимость ввести новый целочисленный тип большего размера, должны объявить его как имеющий по крайней мере 64 бит (это действительно новый тип, которого нет в традиционном Си), а не как имеющий точно 64 бит . У меня совсем не получается определение связанного списка. Я пишу: typedef struct char *item; NODEPTR next; } *NODEPTR; но компилятор выдает сообщение об ошибке. Может структура в Си содержать ссылку на себя? Структуры в Си, конечно же, могут содержать указатели на себя. В приведенном тексте проблема состоит в том, что определение NODEPTR не закончено в том месте, где объявляется член структуры next . Для исправления, снабдите сначала структуру тегом ( struct node ). Далее объявите next как struct node *next; , и/или поместите декларацию typedef целиком до или целиком после объявления структуры. Одно из возможных решений будет таким: struct node char *item; struct node *next; typedef struct node *NODEPTR; Есть по крайней мере три других одинаково правильных способа сделать то же самое. Сходная проблема, которая решается примерно так же, может возникнуть при попытке определить с помощью средства typedef пару ссылающихся друг на друга структур. Как объявить массив из N указателей на функции, возвращающие указатели на функции возвращающие указатели на char? Есть по крайней мере три варианта ответа: 1. char *(*(*a[N])())(); 2. Писать декларации по шагам, используя typedef: typedef char *pc; /* указатель на char */ typedef pc fpc(); /* функция,возвращающая указатель на char */ typedef fpc *pfpc; /* указатель на.. см. выше */ typedef pfpc fpfpc(); /* функция, возвращающая... */ typedef fpfpc *pfpfpc; /* указатель на... */ pfpfpc a[N]; /* массив... */ 3. Использовать программу cdecl, которая переводит с английского на Си и наоборот. cdecl> declare a as array of pointer to function returning pointer to function returning pointer to char char *(*(*a[])())() cdecl может также объяснить сложные декларации, помочь при явном приведении типов, и, для случая сложных деклараций, вроде только что разобранного, показать набор круглых скобок, в которые заключены аргументы. Версии cdecl можно найти в comp.sources.unix и в K&R II. Я моделирую Марковский процесс с конечным числом состояний, и у меня есть набор функций для каждого состояния. Я хочу, чтобы смена состояний происходила путем возврата функцией указателя на функцию, соответствующую следующему состоянию. Однако, я обнаружил ограничение в механизме деклараций языка Си: нет возможности объявить функцию, возвращающую указатель на функцию, возвращающую указатель на функцию, возвращающую указатель на функцию... Да, непосредственно это сделать нельзя. Пусть функция возвращает обобщенный указатель на функцию, к которому перед вызовом функции будет применен оператор приведения типа, или пусть она возвращает структуру, содержащую только указатель на функцию, возвращающую эту структуру.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |