Функция прототипирования без аргументов в C [duplicate]

После этой проблемы на удаленных серверах (production, test, qa, staging и т. д.), но не на локальных рабочих станциях разработки, я обнаружил, что пул приложений был настроен с RequestLimit, отличным от 0.

Это заставило пул приложений отказаться от ответа и ответить с исключением, указанным в вопросе.

Где-то в пути, когда мой проект установочного экрана изменил определение своего пула приложений на использование «3» (возможно, щелчок или неправильный тип).

380
задан 10 revs, 9 users 37% 2 February 2013 в 04:11
поделиться

8 ответов

Все остальные ответы верны, но только для завершения

Функция объявляется следующим образом:

  return-type function-name(parameter-list,...) { body... }

return-type - тип переменной, возвращаемый функцией. Это не может быть тип массива или тип функции. Если не задано, тогда предполагается int.

имя функции - это имя функции.

parameter-list - список параметров, которые функция разделяет запятыми. Если параметры не заданы, то функция не принимает никаких и должна быть определена с пустым набором скобок или с ключевым словом void. Если переменный тип не находится перед переменной в списке paramater, предполагается int . Массивы и функции не передаются в функции, а автоматически преобразуются в указатели. Если список завершен с помощью многоточия (, ...), то нет заданного количества параметров. Примечание: заголовок stdarg.h может использоваться для доступа к аргументам при использовании многоточия.

И снова ради полноты. Из спецификации C11 6: 11: 6 (страница: 179)

Использование деклараторов функций с пустыми скобками (не деклараторы типа параметра прототипа) является устаревшим особенность.

268
ответ дан Krishnabhadra 28 August 2018 в 02:19
поделиться

Вот почему я обычно советую людям скомпилировать свой код с помощью:

cc -Wmissing-variable-declarations -Wstrict-variable-declarations -Wold-style-definition

Эти флаги обеспечивают выполнение нескольких действий:

  • -Wmissing-variable-declarations : Невозможно объявить нестационарную функцию, не получив сначала прототип. Это делает более вероятным, что прототип в файле заголовка совпадает с фактическим определением. В качестве альтернативы, он предусматривает, что вы добавляете ключевое слово static в функции, которые не должны быть видимыми публично.
  • -Wstrict-variable-declarations: прототип должен правильно перечислять аргументы.
  • -Wold-style-definition: само определение функции также должно правильно перечислять аргументы.

Эти флаги также используются по умолчанию во многих проектах с открытым исходным кодом. Например, во FreeBSD эти флаги включаются при создании с WARNS = 6 в Makefile.

0
ответ дан Ed Schouten 28 August 2018 в 02:19
поделиться

C предполагает int, если тип типа не задан для типа возвращаемой функции и списка параметров. Только для этого правила возможны следующие странные вещи.

Определение функции выглядит следующим образом.

int func(int param) { /* body */}

Если его прототип вы пишете

int func(int param);

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

int func(int);

Также, если вы не указали тип параметра, но имя int принимается как тип.

int func(param);

Если вы идете дальше, то также работает.

func();

Когда вы пишете func(), компилятор принимает int func(). Но не помещайте func() внутри тела функции. Это будет вызов функции

55
ответ дан Jens 28 August 2018 в 02:19
поделиться

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

компиляция вашей программы используя gcc foo.c -Wextra, я получаю:

foo.c: In function ‘func’:
foo.c:5:5: warning: type of ‘param’ defaults to ‘int’ [-Wmissing-parameter-type]

странно -Wextra не понимает этого для clang (по какой-либо причине он не распознает -Wmissing-parameter-type, возможно, для исторических, упомянутых выше) но -pedantic делает:

foo.c:5:10: warning: parameter 'param' was not declared, 
defaulting to type 'int' [-pedantic]
int func(param)
         ^
1 warning generated.

И для проблемы с прототипом, как сказано выше int func(), относится к произвольным параметрам, если вы явно не определяете его как int func(void), который затем даст вам ошибки, как ожидалось:

foo.c: In function ‘func’:
foo.c:6:1: error: number of arguments doesn’t match prototype
foo.c:3:5: error: prototype declaration
foo.c: In function ‘main’:
foo.c:12:5: error: too many arguments to function ‘func’
foo.c:5:5: note: declared here

или в clang как:

foo.c:5:5: error: conflicting types for 'func'
int func(param)
    ^
foo.c:3:5: note: previous declaration is here
int func(void);
    ^
foo.c:12:20: error: too many arguments to function call, expected 0, have 1
    int bla = func(10);
              ~~~~ ^~
foo.c:3:1: note: 'func' declared here
int func(void);
^
2 errors generated.
5
ответ дан none 28 August 2018 в 02:19
поделиться

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

int func(void);
3
ответ дан P.P. 28 August 2018 в 02:19
поделиться

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

В Old-C, как в ANSI- C «нетипированный формальный параметр», принять размер вашего регистра регистрации работы или глубины команды (теневые регистры или кумулятивный цикл команд), в 8-битном MPU, будет int16, в 16-битном MPU и так будет int16 a так on, в случае, если 64-битные архитектуры могут выбрать компиляцию таких параметров, как: -m32.

Хотя это кажется более простой реализацией на высоком уровне, для передачи нескольких параметров работа программиста в области управления dimencion [gg]

В других случаях для некоторых архитектур микропроцессоров компиляторы ANSI настраивались, использовались некоторые из этих старых функций для оптимизации использования кода, заставляя местоположение этих «нетипизированных формальных параметров» для работы внутри или вне рабочего реестра, сегодня вы получаете почти то же самое с использованием «volatile» и «register».

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

Примеры компиляции с gcc в linux:

main.c [/g2]

main2.c [/g3]

main3.c [/g4] В любом случае утверждение прототипа локально бесполезно, потому что нет вызова без параметров, ссылка на этот прототип будет упущена. Если вы используете систему с «нетипизированным формальным параметром» для внешнего вызова, приступайте к генерации типа данных декларативного прототипа.

Нравится это:

int myfunc(int param);
11
ответ дан RTOSkit 28 August 2018 в 02:19
поделиться

В C func() означает, что вы можете передать любое количество аргументов. Если вам не нужны аргументы, вы должны объявить как func(void). Тип, который вы передаете своей функции, если не указан по умолчанию int.

158
ответ дан Tony The Lion 28 August 2018 в 02:19
поделиться

Сэр, в C ++ (и только C ++) вам разрешено определять несколько функций с тем же именем с разными параметрами. Например:

int func();
int func(int test);
int func(char testing123);

Должен компилироваться. Чтобы выбрать, какую функцию использовать, просто передайте этот тип переменной в скобку при компиляции.

Например:

int testing123=2;
func(testing123);

вызовет func (int test).

В то время как

char test='a';
func(test);

вызовет func (char).

Вам не нужны имена переменных в заголовке функции, хотя до тех пор, пока прототип функции (y ' знаете, строка вверху, которая имеет только функцию без кода в ней) соответствует именам в действительной функции ниже вас будет A OKay (например, вместо int func(int) вы могли бы также иметь int func(int avariable).

Что касается переменной в компиляции прототипа без типа, то, вероятно, по умолчанию используется тип, вероятно, int (хотя я не уверен, что какой тип по умолчанию он может быть изменен компилятором или нет.)

-12
ответ дан user1833028 28 August 2018 в 02:19
поделиться
Другие вопросы по тегам:

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