Компилятор сбоя кода: main () возвращает структуру вместо int - PullRequest
5 голосов
/ 08 июня 2010

Я экспериментирую с куском кода Си.Может кто-нибудь сказать мне, почему 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;

компилятор не падает.

Ответы [ 3 ]

3 голосов
/ 08 июня 2010

Код дает неопределенное поведение. Для этого не требуется сбой компилятора, он просто говорит, что вы в основном нарушили правила, поэтому компилятор не сделал ничего плохого, что бы ни случилось.

Редактировать: при этом, что касается качества реализации, абсолютно верно, что у компилятора практически нет оправдания сбою - разумно говоря, он всегда должен выходить нормально, независимо от того, какие данные вы передаете.

2 голосов
/ 08 июня 2010

Хорошо, вы хотите задать эзотерический вопрос, затем, пожалуйста, постройте полный.

Как вы провели тест?Что вы имеете в виду под аварией?Каким был ваш выход?Вы только что скомпилировали, или скомпилировали и скомпоновали, или скомпилировали и скомпоновали и отладили?Как настроен ваш компилятор?Куда вы идете с этим экспериментом?

фразы вроде: «что-то вроде» «зло» недостаточно информативны, чтобы быть полезными

Follow UP:

Инстинктивно я будуПредположим, что этот сбой является следствием переключателя оптимизации компилятора, с помощью которого вы разрешаете компилятору делать определенные предположения, которым вы не соответствуете.

мои предположения:

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;
   }

Вы поняли идею.уменьшить крушение до его сути.Придумайте программу, которая не содержит ошибок, за исключением одной вещи, которая приведет к ее аварийному завершению.

Затем сообщите.

0 голосов
/ 08 июня 2010

поместите точку с запятой между концом вашей структуры и главной, например:

struct foo {int i; двойной д; }; main (double argc, struct foo argv)

вы также можете определить тип возвращаемого значения для main, если вы собираетесь что-то вернуть:

struct foo {int i; двойной д; }; int main (double argc, struct foo argv)

...