Можете ли вы объявить массив фиксированной длины в объявлении функции? - PullRequest
0 голосов
/ 30 января 2019

Я читаю некоторый код C ++ (SGP4, код распространения по спутнику), и я нашел следующее объявление функции:

void twoline2rv(char longstr1[130], char longstr2[130], char typerun,
            char typeinput, char opsmode, gravconsttype whichconst,
            double &startmfe, double &stopmfe, double &deltamin,
            elsetrec &satrec);

Мне интересно, что значит сказать char longstr1[130] в функцииаргумент.Зачем компилятору знать, что массив имеет длину 130 байт?А почему бы не сказать char *longstr1?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Это вводящий в заблуждение код.Эти параметры буквально означают char *longstr1 (тьфу).Там нет проверки границ, ничего.Вы можете передать указатель на массив любой длины.Кажется, вы уже это знаете.

Теперь можно утверждать, что этот подход самодокументирован, но я бы сказал, что он документирует ложь.Если указатель «должен» иметь конкретную границу, то это должно быть задокументировано с комментариями над объявлением функции, а не предлагать читателям, что оно будет принудительно установлено по типу.Возможно, что автор подумал, что!

В конечном счете, чтобы действительно выяснить, почему он был написан таким образом, вы должны найти автора и спросить его.Все остальное - догадки.

0 голосов
/ 30 января 2019

Это то же самое;объявление уменьшается до char *longstr1, но для кого-то, кто читает API, более информативно, что он ожидает буфер точно в 130 символов.

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