Как можно разрешить объявление функции с любым типом параметра? - PullRequest
0 голосов
/ 28 марта 2010

Я забыл написать параметр void, но он работает, я положил void, это дает ошибку это позволяет:

print(int size,int table[size][size]){
  int i,j;
  printf("-------TABLE-------\n");
  for(i = 0;i<size;i++){
    for(j = 0;j<size;j++){
       if(table[i][j]==EMPTY)
        printf(". ");
       else
        printf("* ");
    }
    printf("\n");
  }
}

там написано, что "ранее здесь было неявное объявление" (означает вызов в main)

void print(int size,int table[size][size]){
  int i,j;
  printf("-------TABLE-------\n");
  for(i = 0;i<size;i++){
    for(j = 0;j<size;j++){
       if(table[i][j]==EMPTY)
        printf(". ");
       else
        printf("* ");
    }
    printf("\n");
  }
}

Ответы [ 4 ]

1 голос
/ 28 марта 2010

Если вы объявляете функцию

foo(int x) {
}

компилятор выведет тип возвращаемого значения int, как если бы вы написали

int foo(int x) {
}

Но на самом деле это наименьшая из ваших проблем.

Ссылка: & 1.3.1 из Справочное руководство по библиотеке C Э. Хуссом

0 голосов
/ 29 марта 2010

В C, в отличие от C ++, и при условии, что вы не используете режим строгого соответствия C99 в своем компиляторе, тогда, когда компилятор сталкивается с чем-то, что выглядит как вызов функции, но идентификатор ранее не был объявлен, тогда Компилятор предполагает, что это имя функции, возвращающей целое число.

int main(void)
{
     something_functional(1, 2);
}

Без прототипа компилятор в C90 или в расслабленном режиме C99 будет предполагать, что'thing_functional () 'действительно является функцией, возвращающей целое число.

Если впоследствии вы напишите:

something_functional(double d, char *s)
{
    ...
}

Компилятор предположит, что возвращаемый тип функции'thing_functional () 'равен int и позволит скомпилировать код (несмотря на ужасное несоответствие между фактическими типами аргументов в вызове и в определении функции).

Если впоследствии вы напишите:

void something_functional(douebl d, char *s)
{
    ...
}

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

Существует несколько способов решения проблемы:

  1. Переместить определение функции перед вызовом функции. Это то, что требуется Паскалю, и приводит к появлению функции main () внизу файла.
  2. Поместите прототип для функции перед ее использованием в файле:

    статическая пустота что-то_функция (double d, char * s);

Я считаю, что если функция не будет вызываться извне исходного файла, она должна быть статической.

Обратите внимание, что C99 в режиме строгого соответствия не позволяет вам объявлять функции неявно. C ++ никогда не имеет либо.

Есть еще одна интересная особенность pre-C99. Вы также можете написать:

static c;
static function();

some_function(a, b)
{
}

Это определяет целочисленную переменную c, функцию с именем function(), которая возвращает int, и функцию с именем some_function(), которая принимает два int аргумента и возвращает int.

Это не разрешено в строгом коде C99 - и не было особенно хорошим стилем в коде C90, но было разрешено для обратной совместимости с предстандартным C.

0 голосов
/ 29 марта 2010

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

0 голосов
/ 28 марта 2010

без void, например, function () говорит, что объявление функции может иметь любые параметры.
Функция (void) говорит, что у нее точно нет.

...