Để bắt đầu, hãy nói về vấn đề của bạn một chút. Tôi nghĩ nguyên nhân có khả năng nhất gây ra lỗi hệ thống của bạn trên một hệ thống so với hệ thống khác là mã không giống nhau; bạn có thể muốn xác minh điều này thông qua một số công cụ hoặc lệnh diff
để tìm kiếm bất kỳ thay đổi tinh tế nào đã xuất hiện trong cơ sở mã của bạn. vấn đề thường khi tôi đã nhìn thấy với kiểu lỗi, bạn có cái gì đó như:
typedef struct Foo* Fooptr;
Trong một tập tin tiêu đề và sau đó:
typedef struct Foo
{
int bar;
} *Fooptr;
trong file nguồn. Có nghĩa là bạn có thể chỉ cần gõ typedef vào nguồn và nó sẽ là OK. Chỉ cần một cái gì đó để tìm kiếm.
Bây giờ nếu nó là một vấn đề gcc
, một lựa chọn thứ hai để giải quyết vấn đề của bạn, nó có thể have multiple versions of gcc on the same computer và sau đó để xác định chính xác phiên bản của gcc
để chạy với qua tùy chọn -v
. Vì vậy, có thể là một ý tưởng hay khi cho 4.1.2 một shot trên máy Fedora 18 của bạn.
lưu ý khác, nếu bạn sử dụng tùy chọn -v
, nhưng không định một phiên bản của gcc
để chạy, bạn sẽ nhận được (trên đầu ra stderr) các lệnh thực thi để chạy các giai đoạn biên dịch. Điều này có thể hữu ích để xem điều gì đang xảy ra và nếu có bất kỳ sự khác biệt lớn nào giữa những gì đang xảy ra trên mỗi máy.
OK, bây giờ cho câu hỏi của bạn. Có, có các cờ để biên dịch trên “phiên bản X” của gcc
: Để bắt đầu có __VERSION__
Predefined Macro, điều này sẽ nhổ lại cho bạn số const char *
của số phiên bản. Điều này có thể khá hữu ích, nhưng như các tài liệu hướng dẫn gcc khẳng định:
Bạn không nên dựa vào nội dung của nó có bất kỳ hình thức cụ thể, nhưng nó có thể được tính trên để chứa ít nhất số lượng phát hành
Mặc dù vậy, tôi thường chỉ nhìn thấy 1 hình thức đầu ra từ cái này giống như "4.6.3"
nếu phiên bản gcc
của tôi là 4.6.3-1ubuntu5
.
Bây giờ nếu bạn biết (hoặc nghi ngờ) rằng một số mã của bạn sẽ gây ra một phiên bản đặc biệt của gcc
để gây ra lỗi, bạn có thể sử dụng __GNUC__
, __GNUC_MINOR__
, và __GNUC_PATCHLEVEL__
macro được xác định trước để "bảo vệ" bản thân:
Dưới đây là một ngắn gọn-nó hiển thị ở mức cao nhất làm thế nào để sử dụng nó:
#if __GNC__ == 3
printf(“Hello version 3.x.x\n”);
#elif __GNC__ == 4
printf(“Hello version 4.x.x\n”);
#endif
Vì vậy, trên hệ thống ở trên mà phiên bản 4.6.3 bạn sẽ thấy thông báo “Hello version 4.xx”. Sau đó, bạn có thể được nâng cao hơn và kiểm tra subversions cũng như:
#if __GNUC__ > 3 || \
(__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \
(__GNUC_MINOR__ == 2 && \
__GNUC_PATCHLEVEL__ > 0))
printf(“I’m a gcc greater than 3.2.0\n”);
#endif
Hoặc phiên bản sạch của rằng việc sử dụng vĩ mô của riêng bạn:
#define GCC_VERSION (__GNUC__ * 10000 \
+ __GNUC_MINOR__ * 100 \
+ __GNUC_PATCHLEVEL__)
#if GCC_VERSION > 30200
printf(“I’m a gcc greater than 3.2.0\n”);
#endif
Để giải quyết câu hỏi của bạn về nếu phiên bản khác nhau của gcc
sẽ tạo ra các lỗi khác nhau, bạn chính xác rằng trong mỗi bản phát hành gcc
sẽ xảy ra nhiều hơn và đôi khi mọi thứ thay đổi, do đó bạn sẽ thấy sự khác biệt giữa các phiên bản khác nhau của trình biên dịch. Đặt cược tốt nhất là kiểm tra ghi chú phát hành cho mỗi phiên bản giữa hai phiên bản bạn đang sử dụng. (từ 4.1 đến 4.7).
Tôi không chắc chắn bạn có kiến trúc đích nào, vì vậy hãy đảm bảo rằng bạn kiểm tra các phần cụ thể đó trong từng tài liệu. Nhưng tôi nghĩ bạn thực sự muốn có một cái nhìn tại "Build system improvements"
và "Incompatible changes to the build system"
, họ cũng tạo một phần cụ thể cho mã C có thể hữu ích để xem xét.
Có, các trình biên dịch/phiên bản/cờ khác nhau có thể tạo ra các kết quả khác nhau, đặc biệt. trong '# ifdef'-mã nặng. –
theo như 'bất kỳ cờ nào tôi có thể đặt để tránh điều này trong tương lai', câu trả lời của tôi có bao gồm điều đó hay bạn đang nghĩ đến điều gì đó khác? – Mike
một số thông tin hữu ích sẽ tốt đẹp, nó có nhiều khả năng là một tiêu đề kèm theo khác nhau trên một hệ thống hơn trình biên dịch, nhưng bạn không bao giờ đề cập đến nơi channel.h hoặc internal.h là hoặc cách chúng được đưa vào. các đường xung quanh xung quanh nơi channel_t xuất hiện sẽ hữu ích quá ... ít nhất là đến ifdefs. CFLAG của bạn định nghĩa có nghĩa là hoàn toàn không có gì mà không có điều đó. – technosaurus