2016-08-28 8 views
1

Может ли функция, называемая Main(), с капиталом M, будет создана в C?
Поскольку два элемента с одинаковым именем, но разные случаи рассматриваются как отдельные объекты, на мой взгляд, Main() может быть создан, но мне просто нужно подтвердить.В C может быть создана функция Main()?

+4

Почему бы вам не попробовать? –

+1

Я бы пошел на 'maiN()' –

+0

Ну, это было на среднесрочный тест для C! – Cersei

ответ

1

Это ужасная идея, и некоторые среды, которые не являются строго соответствующими, могут зарезервировать это имя. Но линкер должен быть чувствителен к регистру, а Main с капиталом не зарезервирован.

+0

Вы имеете в виду, что нечеткие среды могут зарезервировать Main() как main() и не различать их? – Cersei

+0

Как Visual Studio резервирует WinMain, по крайней мере, в некоторых режимах. Если компилятору нужна альтернативная запись со слегка отличающимися характеристиками к main(), Main является очевидным выбором идентификатора. –

2
int Main (void) 
{ 
    return 0; 
} 

int main (void) 
{ 
    return 0; 
} 

Компиляция и ссылки отлично. Он чувствителен к регистру.

+0

Спасибо! Я все еще новичок; что вы подразумеваете под «это отличные ссылки»? Обе функции находятся в одном файле, не так ли? Извините, если это ужасно глупый вопрос. – Cersei

+0

Да, обе функции в одном файле. У вас есть компилятор, который переводит исходный код в объект-код. Компонент связывает все вместе, чтобы иметь исполняемый файл. Если у вас несколько файлов, они свяжут их вместе, а также с некоторыми библиотеками системы (например, для ввода-вывода, ...). В зависимости от вашей среды оба действия выполняются автоматически, если вы пытаетесь создать исполняемый файл. – chris01

+1

Еще один, чтобы сказать: если вы создадите второй файл и поместите в него нестандартный Main, то компоновщик принесет вам сообщение об ошибке «множественное определение Main». Просто чтобы увидеть, как компоновщик выполняет свою работу. Это не часть вашего вопроса. – chris01

4

Несомненно, почему бы и нет? Препроцессору и компилятору все равно, что "Main" и "main"по существу аналогичны. C чувствителен к регистру, поэтому "Main" и "main" - это два совершенно разных имени. (Он не может помочь читаемость, но нет никаких технических причин, вы не можете) Например,

#include <stdio.h> 

int Main (int argc, char **argv) 
{ 
    for (int i = 1; i < argc; i++) 
     printf (" %2d : %s\n", i, argv[i]); 

    return argc; 
} 

int main (int argc, char **argv) { 

    printf ("\n %d arguments.\n", Main (argc, argv) - 1); 

    return 0; 
} 

Пример использования/вывода

$ ./bin/mainMain The quick brown fox jumps over a lazy dog. 
    1 : The 
    2 : quick 
    3 : brown 
    4 : fox 
    5 : jumps 
    6 : over 
    7 : a 
    8 : lazy 
    9 : dog. 

9 arguments. 
1

Вы уже получили ответ, но только добавить немного авторитетных цитат, непосредственно из C11, глава §5.1.2

Execution среды:

Определены две среды исполнения: автономные и размещенные. В обоих случаях запуск программы происходит, когда назначенная функция C вызывается средой исполнения . [...]

тогда, §5.1.2.2, Hosted среда, p1, "запуск программы"

Функция называется при запуске программы называется main. [...]

Тем не менее, как мы знаем, С чувствителен к регистру, (цитирую §6.4.2.1/2, "Идентификаторы", Общие)

Идентификатор является последовательность недигитных символов (включая символы подчеркивания _, строчные и прописные латинские буквы и другие символы) и цифры, которые обозначают один или несколько объектов, как описано в 6.2.1. Строчные и прописные буквы различны. [....]

такого идентификатор без того же случай, как это main()не то же самое, какmain(), будь то Main(), MAIN(), maiN() или любая другая комбинация возможно. Все они имеют разные идентификаторы в отношении C.

Таким образом, ответ на

В C, может функция называется Main) будет создан (?

есть, конечно.

Просто чтобы прояснить немного больше, если вы только создать Main() и оставить из main(), компилятор сам по себе не будет иметь никакого способа узнать, что вы имели в виду main() написав Main(), так как они имеют разные идентификаторы для компилятора ,

+0

«.. как мы уже знаем ...» - не нужно ссылаться на Википедию, как это конкретно указано в 6.4.2.1: «Строчные и прописные буквы различны». :) – usr2564301

+1

@RadLexus Ну, тогда позвольте мне изменить эту вики на стандартную цитату .. :) –

+0

Это * путь * лучше, чем «почему бы нет»: D – usr2564301

0

Только если вы пишете одну или несколько своих букв в верхнем регистре, я думаю, что, как основной или MAIN, иначе ваш компилятор не сможет указать, какой основной вам нужен, потому что main уже является функцией в C. Примечание: Я тоже новичок, поэтому я мог ошибаться.