2011-09-22 31 views
12

Tôi có một số mã di sản cần một số cờ gcc nhất định. Tôi có thể thêm kiểm tra tiền xử lý cho các cờ này không?không biên dịch nếu cờ bắt buộc không có mặt

Ví dụ, chúng ta hãy nói rằng tôi cần -fno-strict-aliasing, tôi có thể làm một cái gì đó như thế này:

#ifndef _FNO_STRICT_ALIASING 
    #error -fno-strict-aliasing is required! 
#endif 
+0

âm thanh giống như điều gì đó khiến bạn có thể thực hiện. –

+0

@Code Monkey: Tất nhiên lá cờ có thể được chuyển qua thực hiện. Nhưng nếu mã nguồn chuyển sang một hệ thống tạo mới mà tri thức có thể bị mất (ví dụ, nếu bạn đang phân phối nguồn tới một lib). Tôi muốn bản thân mã để biết nó cần gì. Đó là DRY theo cách đó. :) – paleozogt

Trả lời

6

Bạn có thể sử dụng

#pragma GCC optimize "no-strict-aliasing" 

để biên dịch các tập tin với cờ đó (trọng những gì đã được chỉ định trên dòng lệnh). Bạn cũng có thể sử dụng

__attribute__((optimize("no-strict-aliasing"))) 

để áp dụng các lá cờ để một chức năng duy nhất trong một tập tin nguồn ...

+0

Ah! Thậm chí còn tốt hơn những gì tôi đã yêu cầu! – paleozogt

+0

Sẽ tốt hơn nếu bạn sửa mã bị hỏng của mình yêu cầu cờ này, vì vậy nó thực sự hợp lệ C. –

+0

Ồ không: sử dụng pragma không có tính năng bí danh không nghiêm ngặt không hoạt động: https://bugzilla.redhat.com/ show_bug.cgi? id = 486176 – paleozogt

3

Có chắc chắn là không #define cho nó, ít nhất là trên phiên bản của tôi của GCC.

Để xem tất cả những biểu tượng tiền xử lý được xác định trước:

g++ -dM -E - < /dev/null 

Tôi không nghĩ rằng có cách nào để kiểm tra các tùy chọn này. Tuy nhiên, nếu bạn đang sử dụng GCC 4.4 trở lên, bạn có thể sử dụng "optimize" function attribute hoặc "optimize" #pragma để bật các tùy chọn cụ thể trên cơ sở cho mỗi hàm hoặc mỗi tệp.

Ví dụ, nếu bạn thêm video này vào một tập tin header chung:

#if defined(__GNUC__) 
#pragma GCC optimize ("no-strict-aliasing") 
#else 
#error "You are not using GCC" 
#endif 

... nó nên bật tùy chọn cho mỗi tập tin đó bao gồm các tiêu đề.

[cập nhật]

OK vì vậy tôi mất khoảng 10 phút quá lâu để soạn câu trả lời này. Tôi sẽ để nó ở đây cho các liên kết đến các tài liệu GCC.

+1

Ồ không: sử dụng pragma không có bí danh-nghiêm ngặt không hoạt động: https://bugzilla.redhat.com/show_bug.cgi ? id = 486176 – paleozogt

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