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 12:40:23)

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

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

Sam4uk написав:

Мені траплялися згадки, без описів ще кілька варіантів функції 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 13: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 08: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