определение типа в списке параметров - PullRequest
3 голосов
/ 02 апреля 2011
int func(struct x{int a;}y);
int main()
{

}

Приведенный выше код выдает следующую ошибку в c ++
error: типы не могут быть определены в типах параметров
, пока он работает нормально в c с предупреждением, средства в типе c могут быть определены в списке параметров
таким образом, следующий код должен выдавать ошибку переопределения в c

int func(int a,int a);
int main()
{

}

Сомнение: почему приведенный выше код дает ошибку в c ++
error: множественный параметр с именем

Ответы [ 3 ]

5 голосов
/ 02 апреля 2011

Ошибка иметь одинаковое имя параметра дважды, поскольку имена параметров находятся в области видимости в списке параметров. Я думаю, очевидно, что два параметра с одинаковым именем бесполезны?

// Explain why you want to have them say "int a, int a"
int func(int a, int b);

В C разрешено определять содержимое структурных типов в списках типов параметров. Идентификатор тега имеет либо область видимости прототипа, либо область видимости блока (когда функция является определением) и не имеет связи, что означает, что он отличается от структуры, объявленной вне прототипа или блоков, чей идентификатор тега имеет область видимости файла. Вы не можете вызывать такую ​​функцию, кроме как рекурсивно изнутри ее тела.

int func(struct x{int a;} y) { 
  func(y); // fine (the call, not the endless recursion)
}

Обратите внимание, что это применимо только к вызовам, которые происходят в той же единице перевода, в которой определен func. Если в другой единице перевода вы объявляете функцию и структуру следующим образом, это вполне нормально, и функция будет вызываться (вам нужно убедиться, что вышеприведенное объявление не видно, в противном случае вы получите конфликт, потому что x в обеих точках обозначает другой тип).

struct x {int a;};
int func(struct x y);

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

Вы можете определить не только структуру в списке параметров, но и в разделе возвращаемого типа функции

struct x {int a;} func(void) {
  return (struct x){ 0 };
}

Это также относится только к C. В C ++ такое не допускается.

3 голосов
/ 02 апреля 2011

Я не уверен, что вы пытаетесь сделать.Но если функция func должна принимать аргумент типа struct x, тогда -

struct x
{
  // ....
};

int func( struct x obj ) ;
int func( int a, int b ) ; // Notice that the second parameter is changed
                           // from a to b. Both the parameters cannot have
                           // the same name

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

0 голосов
/ 02 апреля 2011

Я тоже не уверен. Но если вы спрашиваете, почему такая ошибка, то раньше речь шла об определении типа

  • в первом случае c ++ нашел синтаксис, который типичен для определения типа, что недопустимо в c ++ (посмотрите, как это выглядит, Махеш)
  • второй не содержит определения типа, поэтому не жалуется на это, а на другой тип проблемы

... все же я сомневаюсь в понимании вопроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...