2010-12-13 30 views
15

trình biên dịch GCC mang lại cho tôi các macro sau:Visual C++ tương đương với __FILE__, __LINE__ và __PRETTY_FUNCTION__

  • __FILE__ để tôi có thể in ra tên file + thư mục.
  • __LINE__ để tôi có thể in số dòng nơi tôi đang in.
  • __PRETTY_FUNCTION__ vì vậy mà tôi có thể in ra tên hàm khá

Liệu Visual C++ có tương đương với các macro? Một câu hỏi phụ, là những tiêu chuẩn cho trình biên dịch C++?

+0

Đối với những người có thể muốn biết thêm về các macro này: http://gcc.gnu.org/onlinedocs/gcc-3.4.0/gcc/Function-Names.html và http://gcc.gnu.org /onlinedocs/cpp/Standard-Predefined-Macros.html – sivabudh

Trả lời

29

Trong VS2008, đây:

struct A 
{ 
    bool Test(int iDummyArg) 
    { 
     const char *szFile = __FILE__; 
     int iLine = __LINE__; 
     const char *szFunc = __FUNCTION__; // Func name 
     const char *szFunD = __FUNCDNAME__; // Decorated 
     const char *szFunS = __FUNCSIG__; // Signature 

     printf("%s\n", szFile); 
     printf("%d\n", iLine); 
     printf("%s\n", szFunc); 
     printf("%s\n", szFunD); 
     printf("%s\n", szFunS); 

     return true; 
    } 
}; 

int wmain(int argc, TCHAR *lpszArgv[]) 
{ 
    A a; 
    a.Test(10); 
} 

sẽ in này:

c:\source\test_projects\blah\blah.cpp 
14 
A::Test 
[email protected]@@[email protected] 
bool __thiscall A::Test(int) 

(Số dòng là "sai" vì không thực sự một số công cụ bổ sung ở phía trên cùng của tôi file.)

2

Tôi biết rằng MSVC cung cấp __FILE____LINE__, cả hai đều là Macro chuẩn. Họ cũng cung cấp __FUNCTION__, mà tôi tin là những gì bạn đang tìm kiếm,

5

Có Visual C++ có chúng hoặc tương đương. Xem các câu trả lời ở đây:

What's the difference between __PRETTY_FUNCTION__, __FUNCTION__, __func__? hàm func/4384860 # 4384860

Cũng lưu ý rằng mặc dù các trường hợp trên được sử dụng, chúng không phải là macro. Chúng là các biến.

+1

Chúng _are_ vĩ mô.Chỉ cần kiểm tra tiêu đề của trang MSDN của họ: [Predefined Macros] (http://msdn.microsoft.com/nl-nl/library/b0084kay.aspx) – MSalters

+0

@MSalters: hmmm ... theo [gcc docs] (http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Function-Names.html) chúng là các biến. Có vẻ như VC++ thực hiện nó khác nhau. – sashang

8

__FILE____LINE__ là tiêu chuẩn và tôi khá chắc chắn về các trình biên dịch của Microsoft về cơ bản luôn có chúng.

__PRETTY_FUNCTION__ là tính năng gcc.

3

__FILE____LINE__ là tiêu chuẩn kể từ C89. __PRETTY_FUNCTION__ là một GCCism. __func__ là một C99ism mà (không giống như GCCisms) cũng có thể có sẵn trong Visual C++; nó không chính xác giống như __PRETTY_FUNCTION__ nhưng nó có thể đủ gần cho mục đích của bạn.

1
  1. Có, Microsoft Visual Studio có __FILE____LINE__. Here are more MSVC macros.

  2. Cả hai đều là ANSI C++.

  3. MSVC có __FUNCTION__, cụ thể cho Microsoft.

6

Để biết thêm tính di động khi nhận tên hàm hiện tại, bạn có thể thử BOOST_CURRENT_FUNCTION.

+0

Ồ, điều này thật tuyệt vời. Cảm ơn bạn đã đề cập đến nó. – sivabudh

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