У меня есть подозрение, что есть старый неприятный способ запустить функцию при вычислении параметра, но, поскольку я не знаю, как он называется, я не могу найти правила.
Пример
char dstr[20];
printf("a dynamic string %s\n", (prep_dstr(dstr),dstr));
Идея состоит в том, что "()" вернет адрес dstr после выполнения функции prep_dstr.
Я знаю, что это некрасиво, и я мог бы просто сделать это на линии раньше, но это сложно...
#Ок - в ответ на просьбу этого не делать.
На самом деле я выполняю очистку MISRA для некоторого существующего кода (не моего, не стреляйте в меня), в настоящее время функция «prep_dstr» принимает буфер, изменяет его (независимо от длины буфера) и возвращает указатель, который он передал как параметр.
Мне нравится делать маленький шаг — тестировать, а затем еще один маленький шаг.
Итак, чуть менее неприятный подход, чем возврат указателя без понятия о его сохранении, состоит в том, чтобы остановить функцию, возвращающую указатель, и использовать оператор запятой (после того, как он убедится, что он не отрывается от конца буфера).
Это приводит к обратному отсчету ошибок MISRA, когда все это все еще работает и ошибки MISRA исчезнут, я попытаюсь перейти к элегантности - возможно, через год после следующего :).
,
возвращает результат последнего выражения. - person martin   schedule 27.08.2014()
находится значительно выше по пищевой цепочке, чем оператор запятой, фактически они находятся на противоположных концах галактики приоритета оператора. - person WhozCraig   schedule 27.08.2014prep_dstr(dstr); printf("a dynamic string %s\n", dstr);
. Кроме того, MISRA запрещает использование stdio.h в производственном коде. - person Lundin   schedule 08.09.2014