Почему никакая ошибка компилятора для основного () без возврата в конце?

Это зависит в целом. Но большую часть времени в промышленности они следуют структуре нормализации. Мое предложение было бы не создавать каждую таблицу для каждой компании. Составьте таблицу для всех компаний. Храните их данные в отдельных таблицах. Постарайтесь, чтобы ваши таблицы соответствовали отношениям 1: 1. Так что вы можете легко получить результаты. Смотрите ссылки ниже, пожалуйста. Если вы хотите повысить производительность, создайте другую таблицу, в которой есть только те столбцы, которые очень важны. (Вы сказали, что 150 столбцов, я не думаю, что все они полезны).

Что более эффективно: несколько MySQL столы или один большой стол?

9
задан casperOne 24 January 2013 в 12:22
поделиться

5 ответов

Как Jens указал в комментарии, отправленный код не показывает неопределенное поведение. Исходный ответ здесь не корректен и, даже действительно кажется, не отвечает на вопрос так или иначе (при перечитывании всего несколько лет спустя).

Вопросу можно подвести итог как, "почему не делает предупреждения о проблемах MSVC C4716 для main() при тех же обстоятельствах это было бы для других функций"?

Обратите внимание, что диагностический C4716 является предупреждением, не ошибкой. Что касается языка C (с точки зрения стандартов так или иначе), никогда нет требования для диагностирования неошибки. но это действительно не объясняет, почему существует различие, это - просто техническая особенность, которая может означать, что Вы не можете жаловаться слишком много...

Реальное объяснение того, почему MSVC не выдает предупреждение для main() тому, когда это делает для других функций, может действительно только ответить кто-то в команде MSVC. Насколько я могу сказать, документы не объясняют различие, но возможно я пропустил что-то; таким образом, все, что я могу сделать, размышляйте:

В C++, main() функцию рассматривают особенно, в котором существует неявное return 0; незадолго до закрывающей фигурной скобки.

Я подозреваю, что компилятор C Microsoft обеспечивает ту же обработку, когда это компилирует в режиме C (при рассмотрении ассемблерного кода регистр EAX очищен, даже если существует нет return 0;), поэтому насколько компилятор обеспокоен, что нет никакой причины для предупреждения о проблемах C4716. Обратите внимание, что режим C Microsoft C90 совместимый, не совместимый C99. В C90 'убегание конца' main() имеет неопределенное поведение. Однако всегда возврат 0 отвечает низким требованиям неопределенного поведения, таким образом, нет никакой проблемы.

Таким образом, даже если программа в вопросе действительно убегала конец main() (приводящий к неопределенному поведению) все еще не было бы предупреждением.


Исходный, не так хороший ответ:

В ANSI/ISO 90 C это - неопределенное поведение, таким образом, MS действительно должен произвести ошибку (но они не обязаны по стандарту). В C99 стандарт разрешает подразумеваемое return в конце основного () - как делает C++.

Таким образом, если это компилируется как C++ или C99, нет никакой ошибки, и он совпадает с return 0;. C90 приводит к неопределенному поведению (который не требует диагностики).

Интересно (хорошо, возможно, не), этих нескольких компиляторов (VC9, VC6, GCC 3.4.5, Цифровой Марс, Comeau) я примерил это со своим основным набором главным образом опций по умолчанию (среда, которую я в значительной степени всегда использую для тестирования quick-n-dirty фрагментов кода), единственный компилятор, который предупреждает о недостающем операторе возврата, VC6 при компиляции как программа C++ (VC6 не жалуется при компиляции для C).

Большинство компиляторов жалуется (предупреждение или ошибка), если функцию не называют main. Цифровой Марс, когда компиляция для C не делает и GCC, не делает для C или C++.

9
ответ дан 4 December 2019 в 10:34
поделиться

если Вы не возвращаете ничего, что программа возвратит 0. См. http://www.research.att.com/~bs/bs_faq2.html#void-main

6
ответ дан 4 December 2019 в 10:34
поделиться

Из http://msdn.microsoft.com/en-us/library/k9dcesdd (по сравнению с 71) .aspx

Ссылка языка C++

Функция выхода

Функция выхода, объявленная в стандарте, включает файл STDLIB.H, завершает программу C++.

Значение, предоставленное как аргумент выходу, возвращено к операционной системе как код возврата программы или код выхода. Условно, код возврата нулевых средств, что программа, завершенная успешно.

Обратите внимание, что можно использовать константы EXIT_FAILURE и EXIT_SUCCESS, определенный в STDLIB.H, для указания на успешность или неуспешность программы.

Издание оператора возврата от основной функции эквивалентно вызыванию функции выхода с возвращаемым значением как его аргумент.


1
ответ дан 4 December 2019 в 10:34
поделиться

Поскольку это не ошибка - это - неопределенное поведение. Посмотрите раздел 6.9.1, абзац 12 стандарта C99:

Если}, который завершает функцию, достигнут, и значение вызова функции используется вызывающей стороной, поведение не определено.

Таким образом компилятор является бесплатным сделать независимо от того, что он хочет при наблюдении кода, не удающегося возвратиться - он может испустить ошибку, предупреждение или ничто вообще. В случае GCC, этого компиляциями по умолчанию успешно без предупреждений или ошибок. С -Wall опция, это испускает предупреждение.

main() является особенным в C: это - единственная функция, это позволило не возвращать значение. В стандарте C говорится это, если управление достигает конца main() без a return оператор, это неявно возвращается 0. Это только верно для main(), все другие непустые функции должны возвратить значение.

Раздел 5.1.2.2.3:

Если тип возврата основной функции является типом, совместимым с интервалом, возврат от начального вызова до основной функции эквивалентен вызыванию функции выхода со значением, возвращенным основной функцией как ее аргумент; 10) достижение}, который завершает основную функцию, возвращает значение 0. Если тип возврата не совместим с интервалом, состояние завершения, возвращенное к серверной среде, является неуказанным.

1
ответ дан 4 December 2019 в 10:34
поделиться

Компиляция может быть достаточно умной, чтобы знать, что выходят (0), называется, который никогда не возвращается так, это не нужно.

2
ответ дан 4 December 2019 в 10:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: