2

Можно ли использовать атрибуты в параметрах функции main?

В стандарте указаны только 2 возможные формы без атрибутов, но дело в том, что у меня в программе не используется argc параметр и я хотел бы пометить его как maybe_unused, чтобы не выдавало предупреждения постоянно:

int main([[maybe_unused]] int argc, char* argv[]);

Ошибок код не выдает, но легально ли так делать?

Alexandr
  • 569
wall
  • 21
  • 1
    можно конечно, всего означает, что аргумент может быть не использован – AR Hovsepyan Jul 04 '20 at 10:15
  • Не очень понятно, как вы будете использовать argv, если не знаете их кол-во, заданное в argc. Вероятно, вам просто нужно использовать вариант main без параметров. Кстати, почитать про атрибуты можно тут. – αλεχολυτ Jul 04 '20 at 21:05

1 Answers1

1

Эти атрибуты - это отключение соответствующих warning у компилятора, они не влияют на итоговый код.

Следовательно, в свете их применения, нет разницы, в каком месте их применять.

Альтернативно, можно убрать у параметра имя. Это как раз явно - нет имени, значит, и пользоваться нельзя. Понадобится воспользоваться - вернете имя на место.

 int main(int, char*[]);
gbg
  • 22,253
  • "Да, так можно делать" - можно подтверждение? – wall Jul 04 '20 at 10:51
  • а для чего точная ясность использует или не использует? Зачем все тело функции просматривать. Используется или нет, в данном случаи не важно, важно то, что разрешено не использовать. – AR Hovsepyan Jul 04 '20 at 11:08
  • @ARHovsepyan вариант int main(int, char*[]); точно разрешён, а вот с аттрибутом непонятно – wall Jul 04 '20 at 11:09
  • почему не понятно? Очень даже понятно. В указанном вами варианте(старый прием) придется добавлять имя, если вдруг понадобился, а с атрибутом(современный подход) просто используйте или не используйте – AR Hovsepyan Jul 04 '20 at 11:13
  • @ARHovsepyan можно подтверждение, что в параметрах main могут быть аттрибуты? – wall Jul 04 '20 at 11:15
  • Подтверждением является его предназначение. – AR Hovsepyan Jul 04 '20 at 11:17
  • https://ru.wikipedia.org/wiki/C%2B%2B17#%D0%90%D0%BD%D0%BD%D0%BE%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2_%D0%B8%D0%BC%D1%91%D0%BD_%D0%B8_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BF%D0%B5%D1%80%D0%B5%D1%87%D0%B8%D1%81%D0%BB%D1%8F%D0%B5%D0%BC%D0%BE%D0%B3%D0%BE_%D1%82%D0%B8%D0%BF%D0%B0 – AR Hovsepyan Jul 04 '20 at 11:23
  • @ARHovsepyan там не сказано, что аттрибуты можно использовать в main. – wall Jul 04 '20 at 11:26
  • 1
    @wall Эти атрибуты - это отключение соответствующих warning у компилятора, они не влияют на итоговый код. – gbg Jul 04 '20 at 11:29
  • @gbg почему в объявлении функции явно указан список аттрибутов, а у main - нет? – wall Jul 04 '20 at 11:34
  • @wall Потому что там есть третий пункт про implementation defined, и атрибуты эти - тоже implementation defined – gbg Jul 04 '20 at 11:45
  • @gbg тогда нельзя использовать кроссплатформенно, получается – wall Jul 04 '20 at 11:57