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

1 ... 182 183 184 [ 185 ] 186 187 188 ... 210


У меня возникают странные сообщения об ошибках внутри кода, выключенного с помощью #ifdef

Согласно ANSI C, текст, выключенный с помощью #if,

#ifdef или #ifndef должен состоять из корректных единиц

препроцессирования .

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

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

Могу я объявить main как void, чтобы прекратились раздражающие сообщения main return no value ? (Я вызываю exit(), так что main ничего не возвращает)

Нет. main должна быть объявлена как возвращающая int и использующая либо два, либо ни одного аргумента (подходящего типа). Если используется exit(), но предупреждающие сообщения не исчезают, вам нужно будет вставить лишний return, или использовать, если это возможно, директивы вроде notreached .

Объявление функции как void просто не влияет на предупреждения компилятора; кроме того, это может породить другую последовательность вызова/возврата, несовместимую с тем, что ожидает вызывающая функция (в случае main это исполняющая система языка Си).

В точности ли эквивалентен возврат статуса с помощью exit(status) возврату с помощью return?

Формально, да, хотя несоответствия возникают в некоторых

старых нестандартных системах, в тех случаях, когда данные,

локальные для main(), могут потребоваться в процессе завершения

выполнения (может быть при вызовах setbuf() или atexit()), или

при рекурсивном вызове main().

Почему стандарт ANSI гарантирует только шесть значимых символов (при отсутствии различия между прописными и строчными символами) для внешних идентификаторов?

Проблема в старых компоновщиках, которые не зависят ни

от стандарта ANSI, ни от разработчиков компиляторов.

Ограничение состоит в том, что только первые шесть символов



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

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

Если вы не согласны или надеетесь с помощью какого-то трюка заставить компилятор, обремененный ограничивающим количество значимых символов компоновщиком, понимать большее количество этих символов, читайте превосходно написанный раздел 3.1.2 X3.159 Комментариев .

Какая разница между memcpy и memmove?

memmove гарантирует правильность операции копирования, если две области памяти перекрываются. memcpy не дает такой гарантии и, следовательно, может быть более эффективно реализована. В случае сомнений лучше применять memmove.

Мой компилятор не транслирует простейшие тестовые программы, выдавая всевозможные сообщения об ошибках

Видимо, ваш компилятор разработан до приема стандарта

ANSI и поэтому не способен обрабатывать прототипы функций и

тому подобное.

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

Нет ничего необычного в том, что компилятор,

воспринимающий ANSI синтаксис, не имеет ANSI-совместимых

головных файлов или стандартных библиотек.

Почему компилятор Frobozz Magic C , о котором говорится, что он ANSI-совместимый, не транслирует мою программу? Я знаю, что текст подчиняется стандарту ANSI, потому что он транслируется компилятором gcc

Практически все компиляторы (а gcc - более других) поддерживают некоторые нестандартные расширения. Уверены ли вы, что отвергнутый текст не применяет одно из таких расширений? Опасно экспериментировать с компилятором для



исследования языка. Стандарт может допускать отклонения, а компилятор - работать неверно.

Почему мне не удаются арифметические операции с указателем типа

void *?

Потому что компилятору не известен размер объекта, на который указывает void *. Перед арифметическими операциями используйте оператор приведения к типу (char *) или к тому типу, с которым собираетесь работать.

Правильна ли запись a[3]= abc ? Что это значит?

Эта запись верна в ANSI C (и, возможно, в некоторых более ранних компиляторах), хотя полезность такой записи сомнительна. Объявляется массив размера три, инициализируемый тремя буквами a, b и c без завершающего стринг символа \0. Массив, следовательно, не может использоваться как стринг функциями strcpy, printf %s и т.п.

Что такое #pragma и где это может пригодиться?

Директива #pragma обеспечивает особую, точно определенную лазейку для выполнения зависящих от реализации действий: контроль за листингом, упаковку структур, подавление предупреждающих сообщений (вроде комментариев /* NOTREACHED */ старой программы lint) и т.п.

Что означает #pragma once ? Я нашел эту директиву в одном из головных файлов

Это расширение, реализованное в некоторых

препроцессорах, делает головной файл идемпотентным, т.е.

эффект от однократного включения файла равен эффекту от

многократного включения. Эта директива приводит к тому же

результату, что и прием с использованием #ifndef.

Вроде бы существует различие между зависимым от реализации, неописанным(unspecified) и неопределенным (undefined) поведением. В чем эта разница?

Если говорить кратко, то при зависимом от реализации

поведении необходимо выбрать один вариант и документировать

его. При неописанном поведении также выбирается один из

вариантов, но в этом случае нет необходимости это

документировать. Неопределенное поведение означает, что может

произойти все что угодно. Ни в одном из этих случаев Стандарт

не выдвигает требований; в первых двух случаях Стандарт иногда



1 ... 182 183 184 [ 185 ] 186 187 188 ... 210

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