2012-01-20 29 views
5

Tôi có rất nhiều mã mẫu. Kể từ khi mã mẫu xấu không ném một lỗi biên dịch, trừ khi nó được biên dịch, có cách nào tôi có thể kiểm tra những mẫu chức năng trình biên dịch thực sự 'biên dịch' và được bỏ qua hoàn toàn?Tôi có thể kiểm tra các mẫu chức năng nào có hoặc chưa được tạo ít nhất một lần không?

EDIT 2:

Nếu một đặc biệt lớp mẫu hoặc hàm mẫu được khởi tạo một lần, đối với bất kỳ loại tham số, sau đó là OK. Tôi muốn danh sách các mẫu chức năng/lớp không bao giờ được khởi tạo dưới mọi hình thức.

Một ví dụ cụ thể là như sau. Chúng là hai hàm mẫu riêng biệt, và tôi muốn biết nếu một trong hai hoặc cả hai không bao giờ được khởi tạo.

template <typename T_InputItr, typename T_Distance> 
void advance(T_InputItr& aItr, T_Distance aN, bidirectional_iterator_tag) 

template <typename T_InputItr, typename T_Distance> 
void advance(T_InputItr& aItr, T_Distance aN, random_access_iterator_tag) 

EDIT: Hiện nay, đối với các lớp học, tôi nhanh chóng chúng trong file .cpp bằng tay như thế này:

template TClass<int>; 

cho tất cả các loại Tôi quan tâm Đó là tốt và tốt.. Nhưng đó là nếu tôi nhớ làm điều đó. Đôi khi tôi cần phải viết rất nhiều lớp/chức năng mẫu nhỏ mà tôi quên tạo một số mẫu chức năng/lớp học /mẫu theo cách thủ công và tìm hiểu sau này xuống đường. Tôi muốn trình biên dịch cho tôi biết điều đó.

Hoặc, nếu tôi có thể nhận danh sách các mẫu chức năng/lớp được khởi tạo (cho bất kỳ tham số nào), thì tôi có thể so sánh danh sách đó với danh sách đầy đủ mà tôi có thể grep trong mã.

Một lợi ích khác sẽ là 'kiểm tra' phương pháp nào được biên dịch trong lớp mẫu sử dụng đặc điểm kiểu để chọn lọc biên dịch một số chức năng nhất định. Tôi muốn chắc chắn logic của mình để chọn các chức năng chính xác là chính xác trước khi tiếp tục.

+0

Và bạn sẽ làm gì nếu bạn có thể kiểm tra điều đó? – Jon

+0

@Jon: Tôi sẽ thử nghiệm nó bằng cách khởi tạo thủ công nó với các loại giả để đảm bảo cú pháp của nó là chính xác, ít nhất là đối với các loại mà tôi biết nó có thể mất. – Samaursa

+0

Vì vậy, có câu trả lời của bạn: thực hiện một dự án thử nghiệm nơi bạn gọi * tất cả * chức năng templated với * tất cả * loại mà bạn biết họ có thể thực hiện. Nếu dự án không biên dịch bạn có vấn đề. :) – Jon

Trả lời

1

người đã đề cập như thế nào "tất cả mọi thứ có thể được giải quyết bằng cách thêm một mức gián tiếp" - bạn có thể thêm một khẳng định tĩnh để mỗi chức năng và xem biên soạn thất bại:

template <typename T> 
struct Asserter 
{ 
    static const bool value = false; 
}; 

template <typename T> 
struct Foo 
{ 
    void foo() 
    { 
    static_assert(Asserter<T>::value, "Foo::foo() is being compiled."); 
    } 
    void bar() 
    { 
    static_assert(Asserter<T>::value, "Foo::bar() is being compiled."); 
    } 
}; 

int main() 
{ 
    Foo<int> f; 
    //f.foo(); // static assertion! 
} 

Nếu bạn không muốn biên soạn để phá vỡ ở mỗi bước, thay vào đó bạn có thể phát ra một Boost static warning hoặc một thứ gì đó có hiệu ứng tương tự.

+0

Tôi đã kết thúc với giải pháp này, gói các xác nhận với các macro không làm gì với một bộ tiền xử lý nhất định. – Samaursa

0

Bạn có thể chạy tệp thực thi của mình thông qua công cụ phân tích tĩnh sau khi biên dịch miễn là bạn đã thiết lập trình biên dịch bao gồm các bảng biểu tượng thích hợp ... Here is a link vào danh sách các công cụ có thể được sử dụng để phân tích mã tĩnh.

2

Vì bạn đang sử dụng MSVC 2008, bạn có thể thực hiện điều này bằng cách tạo tệp bản đồ liên kết và tìm kiếm tất cả các phiên âm của hàm đó hoặc kiểm tra .pdb qua DIA. Bạn sẽ muốn vô hiệu hóa COMDAT gấp với cờ liên kết/OPT: NOICF để bạn có thể tìm thấy các hàm xảy ra để biên dịch cho cùng một assembly.

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