2014-10-14 18 views
7

phù hợp trình biên dịch C Chuẩn ++ định nghĩa một __cplusplus vĩ mô có thể được kiểm tra trong quá trình tiền xử lý để xác định dưới những tiêu chuẩn một file là được biên soạn, ví dụ:Nêu C chuẩn ++ trong nguồn trong một cách tiêu chuẩn

#if __cplusplus < 201103L 
#error "You need a C++11 compliant compiler." 
#endif 

#include <iostream> 
#include <vector> 

int main(){ 
    std::vector<int> v {1, 2, 3}; 
    for (auto i : v){ 
     std::cout << i << " "; 
    } 
    std::cout << std::endl; 
    return 0; 
} 

câu hỏi của tôi là:

  • có một cách tiêu chuẩn để chỉ ra những gì tiêu chuẩn một nguồn tập tin nên được biên soạn?

Điều đó sẽ cho phép xây dựng các công cụ để kiểm tra nguồn trước khi biên soạn để xác định tham số thích hợp cho -std= (x của công việc mà có thể chỉ ra ngôn ngữ kịch bản/phiên bản: #!/usr/bin/env python3).

Một tiêu chuẩn không và cách giòn tôi có thể nghĩ đến là tìm kiếm các kiểm tra tiền xử lý của __cplusplus nhưng trong ví dụ trên tôi có thể cũng đã viết:

#if __cplusplus <= 199711L 
#error "You need a C++11 compliant compiler." 
#endif 

do đó, viết ví dụ một regex sẽ trở nên khá phức tạp để nắm bắt tất cả các biến thể.

EDIT:

Trong khi tôi thông cảm với câu trả lời bằng cách @Gary mà gợi ý dựa trên một hệ thống xây dựng, nó giả định rằng chúng tôi thực sự sẽ có một bước xây dựng.

Nhưng bạn có thể đã ngày hôm nay:

  • sử dụng một thông dịch viên để chạy một chương trình C++ sử dụng ví dụ CINT
  • hoặc sử dụng nguồn để dịch nguồn bằng cách sử dụng ví dụ: rosecompiler

Câu hỏi của tôi cũng là về chỉ ra rằng nguồn là C++ và những gì phiên bản nó được dành cho (tưởng tượng ai đó đào ra mã của tôi 70 năm từ nay khi C++ có thể phổ biến như nói Cobol là ngày nay) .

Tôi đoán điều tương đương tôi sẽ tìm kiếm là C++ equiavlent của HTML: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

+0

Không quan tâm, tại sao bạn quan tâm? Nếu bạn viết mã có khả năng biên dịch trong 98, nó phải được compilable trong 03 hoặc 11 (bạn có thể sử dụng các hàm không được chấp nhận - có khả năng), nhưng nó phải biên dịch - vì vậy mục đích là gì? – Nim

+0

@Nim Tôi đoán là về phiên bản * tối thiểu * yêu cầu tệp. – leemes

+0

@leemes, hãy để tôi đặt câu hỏi khác nhau, nếu một tệp cho biết nó có thể được biên dịch với 98, không 'std =' được thay đổi thành tệp đó? Nếu không, thì cách tiếp cận này không có nghĩa là IMHO, ở cấp dự án quyết định phiên bản bạn đang sử dụng, và có thể có một kiểm tra trong tệp để xử lý các trình biên dịch cũ hơn (để từ chối nếu nó quá cũ ...) – Nim

Trả lời

3

Tiêu chuẩn ++ C theo một cách hơi giống như đang phát triển chống lại thư viện. Theo nghĩa đó, các thư viện thường phát triển theo cách từ từ từ chối các chức năng cũ trong khi truy cập các chức năng mới. Cách điển hình là giới thiệu các phương pháp mới hoặc chữ ký trong khi vẫn cho phép truy cập vào các phương thức cũ. Ví dụ: Ví dụ đơn giản, bạn có thể tạo một ứng dụng cho iPhone tương thích ngược với iOS 4 trở lên. Bạn không có tùy chọn để anh đào chọn phiên bản cụ thể bạn muốn hỗ trợ.Điều này là tốt bởi vì nếu không bạn mở mã tiến hóa lên đến một ma trận của các khả năng, làm cho mã của bạn khó hiểu và duy trì.

Ngoài ra, bạn có thể giới thiệu các hướng dẫn tiền xử lý để xây dựng các phần nhất định có điều kiện tùy thuộc vào phiên bản hoặc cờ của một số loại. Đây là những biện pháp tạm thời, tuy nhiên, và cần được loại bỏ khi mã phát triển.

Vì vậy, tôi nghĩ rằng để trả lời câu hỏi này, câu hỏi tốt hơn là tự hỏi mình trong tình huống này là gì sẽ thêm một cái gì đó như thế này thực sự giải quyết và nó sẽ thêm phức tạp không cần thiết (một trong những mùi mã của thiết kế xấu)?

Trong tình huống này và từ kinh nghiệm, cá nhân tôi nghĩ rằng bạn đang gắn bó tốt hơn với một tiêu chuẩn. Tôi nghĩ bạn sẽ thấy rằng việc cố gắng phân biệt các tiêu chuẩn bằng cách rải các bộ tiền xử lý khác nhau #ifdef và #ifndefs sẽ làm cho hiểu cơ sở mã của bạn khó hiểu và dễ quản lý. Ngay cả khi bạn có một tệp bao gồm định nghĩa về phiên bản nào được cho phép bao gồm tất cả các tệp khác, nó sẽ trở thành một tệp khác để quản lý .... chưa kể khi bạn thay đổi nó, bạn phải biên dịch lại mọi thứ bao gồm nó.

Nếu bạn lo lắng về việc ai đó đang xây dựng cơ sở mã của bạn với tiêu chuẩn sai, hãy sử dụng hệ thống xây dựng không yêu cầu nhà phát triển nhập thông tin đó. Ví dụ Make, Ant, cmake. Nó làm cho việc xây dựng phần mềm của bạn đơn giản và rõ ràng xác định cách thức dự án nên được biên soạn theo một cách lặp lại. Nếu bạn đi tuyến đường này, bạn sẽ thấy rằng việc cố gắng bảo vệ mã không được biên dịch không đúng cách sẽ trở thành một vấn đề không.

Ngoài ra, nếu chúng đi theo cách của chúng và biên dịch sai tiêu chuẩn, chúng sẽ được chào đón với nhiều lỗi trình biên dịch =)

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