1

Тема: void main(void), int main(void) та інші main

main std
======
Я вивчаю "плюси" і мені хотілося б більше дізнатися про функцію main.
Встандарті описано що функція main може мати такі реалізації:
```c
void main(void){};
int main(void){};
int main(int, char**){};
```

main is live
=======
Мені траплялися згадки, без описів ще кілька варіантів функції main. Один з них виглядав так
```c
int main(int, char**,char**){};
```

Це варіант пробував компілюється без зауважень компілятора.

warning main
=========
Пробував інші варіанти:
```cpp
int main(int);
int main(...);
```
Це також компілюється та життєздатно. Правда компілюється з попередженням '-Wmain'. Але програма  життєздатна. Я ще не експерментував з коли main має змінну кількість аргументів.

other main
=======
Хочу дізнатись які форми та на яких платформах є життєздатними байдуже до ворнінгів. Хто може дати лінк на статтю про недокументовані main`и.

2 Востаннє редагувалося reverse2500 (18.07.2022 13:40:23)

Re: void main(void), int main(void) та інші main

void не повертає значення, як аргумент функції записується досить недавно, але вважається правильним
Трохи відповідей на питання

Мені траплялися згадки, без описів ще кілька варіантів функції main. Один з них виглядав так
```c
int main(int, char**,char**){};

прочитайте про аргументи функції main(): argv і argc

Параметр argc містить кількість аргументів в командному рядку і є цілим числом, причому він завжди не менше 1, тому що першим аргументом вважається ім'я програми. А параметр argv є покажчиком на масив покажчиків на рядки. У цьому масиві кожен елемент вказує на який-небудь аргумент командного рядка. Усі аргументи командного рядка є строковими, тому перетворення яких би то не було чисел в потрібний двійковий формат має бути передбачене в програмі при її розробці.

int main(int argc, char *argv[]) // те саме, назви можна міняти

Не показаний код чому повідомлення про помилки видає

Подякували: Sam4uk, Droid 772

3 Востаннє редагувалося wander (18.07.2022 14:58:25)

Re: void main(void), int main(void) та інші main

Sam4uk написав:

Я вивчаю "плюси" і мені хотілося б більше дізнатися про функцію main.
Встандарті описано що функція main може мати такі реалізації:

void main(void){};
int main(void){};
int main(int, char**){};

Нічого подібного, все що каже стандарт, то це:

An implementation shall not predefine the main function. Its type shall have C++ language linkage and it shall have a declared return type of type int, but otherwise its type is implementation-defined. An implementation shall allow both

  • a function of () returning int and

  • a function of (int, pointer to pointer to char) returning int

as the type of main. [...]

Тобто, стандарт описує лише дві можливі (обов'язкові) форми ф-ї main:

int main(); // без параметрів
int main(int, char**); // та з

, все решта підпадає під так звані "non-standard extensions" або "freestanding environments", де наявність main може бути взагалі не обов'язковою. Так, наприклад, void main(void) – ніколи не була стандартною ні в С++, ні в С.

Sam4uk написав:

Хочу дізнатись які форми та на яких платформах є життєздатними байдуже до ворнінгів. Хто може дати лінк на статтю про недокументовані main`и.

Сумніваюсь, що десь є зібрано от прям всі можливі форми main, в цьому просто немає сенсу. Тому, краще шукайте конкретно по вашій платформі/реалізації.

Подякували: koala, leofun012

4

Re: void main(void), int main(void) та інші main

Коли треба повернути не int значення, тоді як бути?

5

Re: void main(void), int main(void) та інші main

Droid 77 написав:

Коли треба повернути не int значення, тоді як бути?

А можете навести приклад, коли ТРЕБА повернути не int?

Подякували: leofun011

6

Re: void main(void), int main(void) та інші main

Droid 77 написав:

Коли треба повернути не int значення, тоді як бути?

А спробуйте скомпілювати не інтовий `main` :D

7

Re: void main(void), int main(void) та інші main

Вітання всім, хто намагався мені допомогти зрозуміти `main`
https://sam4uk.site/posts/my_name_is_main/
Тут я зібрав усе, що зрозумів про цю функцію. Намагався розібратися.
Некидайте гнилими помідорами, я тільки вчусь.
Планую доповнити матеріал.

8 Востаннє редагувалося koala (26.07.2022 09:23:50)

Re: void main(void), int main(void) та інші main

Чудово, що ви це написали, це трохи допоможе вам впорядкувати ці питання у своїй голові.
Загальні поради:
1. Детальніше вивчить функції. Ви вже рекурсію розбирали? А варіативні (variadic) функції? Макроси va_*?
2. Зробіть собі невеликий екскурс по асемблеру. Будь-якому. До рівня тих же викликів функцій.
3. Вказуйте джерела. Не "я зустрічав", а "в такому і такому проєктах..."
4.

  for(auto c{e}; *c != nullptr; c++,i++)
    printf("\t%s \n",*c);
    printf("total: %d", i);

За таке б'ють. Маєте проблеми з відступами? Ставте після всіх конструкцій фігурні дужки. Обов'язково. Це нагальніше, ніж return в кінці функції. Значно нагальніше. Це може врятувати вам кілька зубів.

Подякували: Sam4uk1