Передача временного значения структуры в функцию работает на Ma c, но не Windows - PullRequest
0 голосов
/ 17 марта 2020

Я портировал свою игру на Windows с Ма c, когда столкнулся с проблемой передачи SDL_Rect s нескольким функциям. Ниже приведен псевдокод для обозначения моей проблемы:

void someFunction(SDL_Rect rect)
{
  // Does something
}

someFunction((SDL_Rect) {0, 0, 10, 10});

Всякий раз, когда я делаю что-то подобное, Visual Studio говорит, что это ошибка. Он отлично работает в XCode и, кажется, не является чем-то, что будет определяться платформой c, рассматривая его как просто агрегатную инициализацию, так что кто-то может объяснить почему?

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Этот код недопустим в ISO C ++. Это будет допустимо в ISO C, и некоторые компиляторы C ++ могут поддерживать его как расширение.

В C ++ вы можете выполнить любое из следующих действий:

  • someFunction( SDL_Rect{0, 0, 10, 10} );
  • someFunction( {0, 0, 10, 10} );

Для того, чтобы быть действительным на обоих языках (нет причин для этого), я думаю, вам нужно будет использовать именованную переменную для аргумента:

SDL_Rect foo = { 0, 0, 10, 10 };
someFunction(foo);

или, возможно, макрос препроцессора, который расширяется по-разному в зависимости от языка.

0 голосов
/ 23 марта 2020

Для тех, кто случайно столкнулся с той же проблемой, что и я, проблема заключалась в том, что g cc имеет расширение, которое допускает нечто, называемое составным литералом. Вот статья об этом: Расширение составных литералов G CC. Самый простой способ исправить это - сыграть нормально, как показано в ответе выше этого!

...