Я экспериментирую с частью кода C. Кто-либо может сказать мне, почему VC 9.0 с SP1 отказывающий для меня? О, и код предназначен, чтобы быть примером, используемым в обсуждении почему что-то как
void main (void)
является злым.
struct foo { int i; double d; } main (double argc, struct foo argv)
{
struct foo a;
a.d=0;
a.i=0;
return a.i;
}
Если я поместил
return a;
компилятор не отказывает.
Код дает неопределенное поведение. Это не требует сбоя компилятора, он просто говорит, что вы в основном нарушили правила, поэтому компилятор не сделал ничего плохого, независимо от того, что происходит.
Правка: тем не менее, как проблема качества реализации, абсолютно верно, что в принципе никогда не бывает оправдания для сбоя компилятора - разумно говоря, он всегда должен выходить нормально, независимо от того, какие данные вы ему передаете.
поместите точку с запятой между концом вашей структуры и main следующим образом:
struct foo {int i; двойной d; }; main (double argc, struct foo argv)
вы также можете определить тип возвращаемого значения для main, если вы собираетесь что-то вернуть:
struct foo {int i; двойной d; }; int main (двойной argc, struct foo argv)
Хорошо, вы хотите задать эзотерический вопрос, тогда, пожалуйста, сформулируйте его полностью.
Как вы запускали тест? Что вы имеете в виду под крахом? Каков был ваш результат? Вы только что скомпилировали, или скомпилировали и скомпилировали, или скомпилировали, и скомпилировали, и отладили? Как настроен ваш компилятор? Куда вы собираетесь проводить этот эксперимент?
фразы типа: «что-то вроде», «зло» недостаточно информативны, чтобы быть полезными
Последующие действия:
Инстинктивно я предполагаю, что этот сбой является следствием компилятор переключатель оптимизации, с помощью которого вы разрешаете компилятору выполнять определенные предположения, которым вы не соответствуете.
мои предположения:
1- void main (void) (без;) является частью вашего комментария, но не часть отправленного вами теста.
2- Ваша программа неверна, но это сделано намеренно с целью расследования
поведение компилятора / компоновщика / среды выполнения.
Если это действительно так, вам нужно уменьшить сложность тестового примера.
Пожалуйста, упростите тестовый пример до минимума, необходимого для сбоя. Я не могу сделать это за вас, у меня нет нужных версий программного обеспечения установлен, в любом случае, это ваш эксперимент.
произойдет ли сбой?
struct foo { int i; double d; };
struct foo main( void)
{
int a=0;
return a;
}
или хотя бы этот самый минимальный пример?
void * main(void)
{
return 0;
}
из этого (я сомневаюсь):
int main( double argc, char ** argv)
{
return 0;
}
Вы уловили идею. свести аварию к ее сути. Придумайте программу, в которой нет ошибок, за исключением одна вещь, которая заставит его рухнуть.
Тогда доложите.