Простой вопрос о приведении типов в C ++ - PullRequest
2 голосов
/ 25 мая 2010

С учетом прототипа функции и определения типа:

int my_function(unsigned short x);
typedef unsigned short blatherskite;

Стандарт определяет следующую ситуацию:

int main(int argc, char** argv) {
  int result;
  blatherskite b;

  b=3;
  result = my_function(b);
}

Можно ли получить приведение типов предсказуемо через прототип функции?

Ответы [ 2 ]

8 голосов
/ 25 мая 2010

Если ваш вопрос действительно о том, совпадают ли типы аргумента и параметра, тогда ответ - да. typedef не вводит новый тип, он только создает псевдоним для существующего. Переменная b имеет тип unsigned int, как и параметр, хотя b объявлено с использованием typedef-name blatherskite.

Ваш пример не очень хорош для демонстрации этого. Все целочисленные типы могут быть преобразованы друг в друга в C ++, поэтому (игнорируя проблемы диапазона) код будет иметь определенное поведение, даже если blatherskite обозначает другой тип (новый тип). Но это не так. Так что это также совершенно верно

void foo(unsigned int* p);
...
blatherskite *pb = 0;
foo(pb); // <- still valid
3 голосов
/ 25 мая 2010

Принуждение типа не требуется. Typedef - это просто псевдоним для того же типа, поэтому вы передаете unsigned short функции, которая принимает unsigned short.

...