Прототипы требуются для всех функций в C89, C90 или C99?

Легкий способ сделать это через XML. Я использовал @Component в уже обработанном jsf bean, но @Autowired не работал, потому что управляемый bean-компонент уже присутствовал в faces-config.xml. Если необходимо сохранить это управляемое имя компонента вместе с его управляемым свойством в XML-файле, тогда предлагается добавить весенний компонент в качестве другого управляемого свойства внутри тега управляемого компонента. Здесь весенний боб в нем определяется в spring-config.xml (может быть где-то попеременно). пожалуйста, обратитесь к https://stackoverflow.com/a/19904591/5620851

под редакцией меня. Я предлагаю либо реализовать его полностью через аннотацию @Managed и @Component, либо через xml для обоих.

46
задан Sydius 12 January 2009 в 08:09
поделиться

4 ответа

Это зависит от того, что Вы подразумеваете 'действительно под совместимыми стандартами'. Однако короткий ответ, "это - хорошая идея гарантировать, чтобы все функции имели прототип в объеме прежде чем быть используемым".

А более квалифицированный ответ отмечает что, если функция принимает аргументы переменной (особенно printf() семья функций), то прототип должен быть в объеме, чтобы быть строго совместимыми стандартами. Это верно для C89 (от ANSI) и C90 (от ISO; то же как C89 за исключением нумерации раздела). Кроме функций 'varargs', тем не менее, функционирует, каким возвратом int не должны быть объявлены, и функции, которые возвращаются, чему-то другому, чем int действительно нужно объявление, которое показывает, что возврат вводит, но не нуждается в прототипе для списка аргументов.

Примечание, однако, что, если функция берет аргументы, которые подвергаются 'нормальным продвижениям' в отсутствие прототипов (например, функция, которая берет char или short - оба из которых преобразовываются в int; более серьезно, возможно, функция, которая берет float вместо double), тогда прототип необходим. Стандарт был слаб об этом, чтобы позволить старому коду C компилировать в соответствии со стандартными совместимыми компиляторами; более старый код не был записан для волнения об обеспечении, что функции были объявлены перед использованием - и по определению, более старый код не использовал прототипы, так как они не стали доступными в C, пока не был стандарт.

C99 запрещает 'неявный интервал'..., который означает оба чудных случая как' static a;' (int по умолчанию) и также объявления неявной функции. Они упоминаются (наряду с приблизительно 50 другими существенными изменениями) в предисловии к ISO/IEC 9899:1999, который сравнивает тот стандарт с предыдущими версиями:

  • удаляют неявный int
    , †¦
  • удаляют объявление

неявной функции В ISO/IEC 9899:1990, В§6.3.2.2 , Вызовы функции указали:

, Если выражение, которое предшествует заключенному в скобки списку аргументов в вызове функции, состоит только из идентификатора, и если никакое объявление не видимо для этого идентификатора, идентификатор неявно объявляется точно как будто, в самом внутреннем блоке, содержащем вызов функции, объявление:

extern int identifier();

появился. <глоток> 38

<глоток> 38 таким образом, идентификатор с областью действия блока, которая, как объявляют, имела внешнюю связь с типом, функционирует без информации о параметре и возврата int. Если на самом деле это не определяется, поскольку имеющий тип “function возврат int, ” поведение не определено.

Этот абзац отсутствует в стандарте 1999 года. Я еще не отследил изменение в формулировке, которая позволяет static a; в C90 и запрещает его (требование static int a;) в C99.

Примечание, что, если функция статична, оно может быть определено, прежде чем оно будет использоваться, и не должен предшествоваться объявлением. GCC может быть убежден болтать, если нестатическая функция определяется без объявления, предшествующего ему (-Wmissing-prototypes).

38
ответ дан Fabio says Reinstate Monica 8 November 2019 в 00:19
поделиться

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

13
ответ дан Artelius 8 November 2019 в 00:19
поделиться

Да, каждая функция должна иметь прототип, но тот прототип может появиться или в отдельном объявлении или как часть определения функции. Функциональные определения, записанные в C89 и естественно, имеют прототипы, но если Вы пишете вещи в классическом K& R стиль, таким образом:

main (argc, argv)

  int argc;
  char **argv;

{
  ...
}

тогда функциональное определение не имеет никакого прототипа. Если Вы пишете ANSI C (C89) стиль, таким образом:

main (int argc, char **argv) { ... }

тогда функциональное определение имеет прототип.

1
ответ дан Norman Ramsey 8 November 2019 в 00:19
поделиться

Насколько я знаю (в ANSI C89/ISO C90), нет. Я не уверен в C99; однако, я ожидал бы то же.

Личное сообщение: я только пишу прототипов функции когда...

  1. мне нужно к (когда () называет B () и , B () звонит ()), или
  2. я экспортирую функцию; иначе это чувствует себя лишним.
0
ответ дан 2 revsAnthony Cuozzo 8 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: