2012-07-16 32 views
6

Tôi đang cố gắng sử dụng các macro __FILE____LINE__ trong một hàm tạo làm thông số mặc định, nhưng dường như tôi không thể sử dụng các macro để sử dụng đúng tệp. Chúng tiếp tục mở rộng từ tệp tiêu đề của tôi.Làm cách nào để sử dụng __FILE__ và __LINE__ làm tham số mặc định trong hàm dựng trong C++?

Cụ thể hơn: Tôi muốn có tệp và số dòng từ nơi đối tượng được khởi tạo làm thành viên trong lớp của tôi. Nhưng tôi không muốn phải đi và đặt các thông số bằng tay mỗi khi tôi muốn sử dụng các vật thể. Tôi biết có một cách để làm điều này, nhưng tôi không thể cho cuộc sống của tôi con số nó ra. Những gì tôi hiện đang làm như sau:

Trong tập tin tiêu đề của tôi:

mnNumber(float x, const char* filename = __FILE__, int linenumber = __LINE__): 
      value(x), mFileName(filename), mFunctionName(nullptr), mLineNumber( linenumber), mID(0) 

Nhưng, FILEĐƯỜNG DÂY được mở rộng như thể họ đang từ tập tin tiêu đề của tôi, không phải là thực tế vị trí tôi sử dụng mnNumber.

Để trả lời câu hỏi tại sao tôi muốn làm điều này, tôi muốn có mã đọc mã riêng của nó. Các giá trị cụ thể mà tôi sử dụng đang được đăng ký trong một người quản lý và giá trị của chúng được phép bởi người dùng cuối. Khi người dùng cuối được thực hiện chỉnh sửa giá trị, giá trị được ghi lại vào trang mã. Vì vậy, tôi cần biết giá trị xuất phát từ đâu. Tôi cũng cho phép người dùng cuối nói rằng họ sẽ không bao giờ cần chỉnh sửa lại giá trị này và khi họ nhấp vào nút đó, giá trị được chuyển đổi từ mnNumber trở lại thành phao và loại trên mã được viết lại dưới dạng phao . Hoặc, sẽ ... hy vọng.

Bạn có lời khuyên nào cho tôi không?

+3

Câu trả lời ngắn: Bạn không thể sử dụng chúng theo cách bạn muốn. Chúng mở rộng tại vị trí mà mã nguồn của hàm tạo được viết, đó là cách mà trình tiền xử lý hoạt động. Đó là một công cụ xử lý văn bản mà không biết gì về "tham số chức năng" và các lượt thích. Trình biên dịch, thứ thực sự giao dịch với các hàm, đối số, vv xuất hiện sau khi bộ tiền xử lý kết thúc. – Xeo

+1

Bạn cần sử dụng macro thay vì hàm tạo. Nó sẽ không hoạt động theo bất kỳ cách nào khác. Điều này có nghĩa là nó không hoàn toàn trên mã chung, ví dụ. –

+0

Và người quản lý của tôi là một singleton? Giải pháp thông minh! – steffen

Trả lời

2

Bạn không thể làm điều này - hai macro này được thay thế bởi bộ tiền xử lý khi nó gặp phải, vì vậy chúng sẽ được trao đổi với tên tệp và lanh đầu trang.

6

Bạn có thể thực hiện việc này với bộ tiền xử lý. Tạo một macro mà mở rộng để __LINE__ và sử dụng nó:

struct S { 
    S(int line, const std::string& file) : 
    line(line), file(file) { 
    } 
    std::string file; 
    int line; 
}; 

#define SCons() S(__LINE__, __FILE__) 

int main() { 

    S s1 = SCons(); 
    S s2 = SCons(); 
    std::cout << s1.line << "\n"; 
    std::cout << s2.line << "\n"; 
}  
0

Các OP đã viết trong một biên tập:

Nó không phải là dễ dàng, nhưng R. Martinho Fernandes đặt tôi trên con đường đúng đắn. Và tôi không nghĩ rằng nó an toàn, nhưng nó hoạt động cho đến nay.

Điều tôi muốn là khả năng theo dõi và cập nhật phao chỉ bằng cách thay đổi loại thành mnFloat. Và tôi thiết lập một định nghĩa gọi một hàm trong trình quản lý của tôi để thêm tên tệp, dòng và tên hàm, sau đó thay đổi float thành kiểu đặc biệt của tôi. Bên trong người quản lý, tất cả họ đều được liên kết với một ID. Khi tôi gọi hàm đăng ký, tôi tạo một đối tượng trong nội bộ mà tôi lưu trữ. Trên cùng một dòng, kiểu đặc biệt của tôi cũng được tạo và nó tự đăng ký với người quản lý. Cả hai đối tượng sử dụng cùng một loại hệ thống ID (ID được tạo ra bằng cách sao chép từ một số tĩnh mà tôi tăng mỗi khi một đối tượng mới được tạo ra). Vì chúng xuất hiện trên cùng một trang mã, ID luôn giống nhau và không bao giờ bị đồng bộ hóa. Giả sử tôi không đi đa luồng, tôi cho là vậy. Nó cảm thấy như gian lận, nhưng nó hoạt động :)

Đây là cách nó hoạt động.Tôi thực hiện việc này:

float test = 0.5; 

Và tôi thay đổi nó như thế này:

mnFloat test = 0.5; 

Trong tập tin tiêu đề của tôi, mnFloat được định nghĩa như sau:

#define mnFloat myManager::getInstance()->register(__FILE__,__FUNCTION__,__LINE__);mnNumber 

Vì vậy, những thay đổi bảng mã để hai hướng dẫn trên dòng đó và số dòng không tăng. Và nó hoạt động!

+0

([Đã trả lời trong một câu hỏi chỉnh sửa và được chuyển đổi thành một cộng đồng wiki] (http://meta.stackoverflow.com/questions/267434/what-is-the-appropriate-action-when-the-answer-to-a- question-is-added-to-the-que)) –

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