2010-06-07 30 views
5

Tôi đang thử nghiệm một đoạn mã C. Bất cứ ai có thể cho tôi biết tại sao VC 9.0 với SP1 bị rơi cho tôi? Ồ, và mã này có nghĩa là một ví dụ được sử dụng trong một cuộc thảo luận tại sao một cái gì đó nhưTrình biên dịch lỗi mã: main() trả về cấu trúc thay vì int

void main (void) 

là điều xấu.

struct foo { int i; double d; } main (double argc, struct foo argv) 
{ 

    struct foo a; 
    a.d=0; 
    a.i=0; 
    return a.i; 
} 

Nếu tôi đặt

return a; 

trình biên dịch không sụp đổ.

+4

Trình biên dịch không bị lỗi chút nào, đó là lỗi với trình biên dịch nếu gặp sự cố khi cố gắng hiểu mã của bạn. – dreamlax

+2

+1 cho ví dụ khó chịu. Đã cho tôi một chút để tìm ra những gì các frizzle bạn đã làm :) Ngoài ra, VS2010 C + + trình biên dịch bây giờ thực thi chính() của chữ ký (iow, mã trên không còn biên dịch). – Alan

+1

Thử đóng cấu trúc bằng dấu chấm phẩy. Xem nếu điều đó thay đổi hành vi của trình biên dịch. Nó thực sự có thể là một lỗi trình biên dịch. –

Trả lời

3

Mã cho hành vi không xác định. Điều này không yêu cầu trình biên dịch sụp đổ, nó chỉ nói rằng bạn đã cơ bản phá vỡ các quy tắc, vì vậy trình biên dịch đã không làm bất cứ điều gì sai, không có vấn đề gì xảy ra.

Chỉnh sửa: chất lượng của vấn đề triển khai, hoàn toàn đúng là cơ bản không bao giờ là lý do cho trình biên dịch bị lỗi - nói một cách hợp lý, nó luôn luôn thoát ra bình thường, bất kể bạn đang nạp dữ liệu gì.

+3

Mã lỗi không bao giờ bị lỗi trình biên dịch. Nếu bản thân chương trình bị treo do hành vi không xác định là một câu chuyện khác. – Maister

+1

Có thể nếu trình biên dịch bị rơi thường xuyên hơn trên các cấu trúc ghê tởm như vậy, chúng ta sẽ không thấy mã khủng khiếp như vậy trong tự nhiên. +100 cho vụ tai nạn địa ngục ra khỏi bất cứ ai cố gắng để biên dịch ở trên. –

+6

Tôi nhớ đọc ở đâu đó về trình biên dịch C "của hacker" sẽ không sinh ra thành công, nhưng trên * bất kỳ lỗi * nào sẽ chỉ xuất ra "Không". – dreamlax

-2

đặt dấu chấm phẩy giữa phần cuối của cấu trúc và chính như sau:

struct foo {int i; đôi d; }; chính (argc đôi, struct foo argv)

bạn cũng có thể định nghĩa một kiểu trả về cho chính nếu trở lại sẽ của bạn một cái gì đó:

struct foo {int i; đôi d; }; int main (double argc, struct foo argv)

+9

Quan điểm của anh ta là anh ta định nghĩa chính để trả về một thể hiện của một cấu trúc ... –

2

Ok bạn muốn đặt ra một câu hỏi bí truyền, sau đó hãy xây dựng một câu hỏi hoàn chỉnh.

Bạn đã chạy thử nghiệm như thế nào? Bạn có ý gì khi gặp sự cố? Đầu ra của bạn là gì? Bạn vừa biên dịch, biên dịch và liên kết, hoặc biên dịch và liên kết và gỡ lỗi? Trình biên dịch của bạn được cấu hình như thế nào? Bạn đang đi đâu với thử nghiệm này?

cụm từ như: "một cái gì đó giống như" "ác" không đủ thông tin để có ích

theo dõi:

Theo bản năng tôi sẽ đoán rằng vụ tai nạn này là kết quả của một trình biên dịch tắc tối ưu hóa với mà bạn cho phép trình biên dịch thực hiện các giả định nhất định mà bạn không tuân thủ.

giả định của tôi:

1- Các chính void (void) (không;) là một phần của một lời nhận xét bạn đang làm, nhưng không phải phần của bài kiểm tra bạn đã gửi.

2- Chương trình của bạn không đúng, nhưng điều này là có chủ ý để điều tra hành vi của trình biên dịch/trình liên kết/môi trường thực thi.
Nếu đây thực sự là trường hợp, bạn cần phải giảm độ phức tạp của trường hợp thử nghiệm.

Vui lòng đơn giản hóa trường hợp kiểm tra đến mức tối thiểu cần thiết để gây ra sự cố. Tôi không thể làm điều đó cho bạn, tôi không cài đặt đúng phiên bản phần mềm , dù sao, đó là thử nghiệm của bạn.

sự cố này có bị lỗi không?

struct foo { int i; double d; }; 
    struct foo main(void) 
     { 
     int a=0; 
     return a; 
     } 

hoặc thậm chí ví dụ tối thiểu nhất này?

void * main(void) 
    { 
    return 0; 
    } 

của nó là thế này (tôi nghi ngờ nó):

int main(double argc, char ** argv) 
    { 
    return 0; 
    } 

Bạn nhận được các ý tưởng. giảm sự sụp đổ đến bản chất của nó. Hãy đến với một chương trình không có lỗi ngoại trừ một điều sẽ làm cho nó bị lỗi.

Sau đó báo cáo lại.

+0

Đây là cách để tái tạo vấn đề: Bắt đầu visual studio 2008 SP1 và tạo một dự án C++ trống mới. Thêm tệp nguồn mới và thêm phần mở rộng .c bằng tay. Bằng cách này, nó sẽ được biên dịch thành C. Nhấn F7. Nếu bạn không thay đổi bất kỳ cài đặt nào, nó sẽ xây dựng bản dựng gỡ lỗi. Kết quả: Trình biên dịch tối ưu hóa của Microsoft đã ngừng hoạt động. Tên sự kiện: APPCRASH. Ồ, và tôi lại đọc câu hỏi. Tà ác và một cái gì đó như là đủ thông tin. Điểm tồn tại của họ là để tránh những nhận xét như "chuẩn C nói int chính (void) blah blah blah" bởi vì tôi đã biết rằng :) và cũng mô tả việc sử dụng mã – AndrejaKo

+0

1 nad 2 là chính xác. Tôi đoán đôi khi tôi không thể thể hiện bản thân mình một cách tốt đẹp. Câu trả lời của bạn bây giờ thực sự hữu ích, vì vậy +1 và cảm ơn cho những ý tưởng. – AndrejaKo

Các vấn đề liên quan