2015-06-23 40 views
1

如果有類似下面的函數,哪裏是默認參數在C++中評估?

void logData(std::string data, int line=__LINE__); 

是評估的默認參數在函數被調用,或在聲明?行爲標準,還是依賴於編譯器?

+0

'__LINE__'由預處理器擴展,被處理的代碼之前由編譯器正確。編譯器只能看到「int line = 123」(或者行號恰好是)。 –

回答

0

你問:

是默認的參數進行評估,其中函數被調用,或在聲明?行爲標準,還是依賴於編譯器?

默認參數的值將是聲明函數的文件的行號。這是根據標準。

從C++ 11標準:

16.8預定義宏名

...的

_ _ LINE _ _
推測的行號(電流源文件內)電流源線(一個整數常量)。

由於__LINE__是預處理器宏,編譯器編譯的代碼中沒有__LINE__。在它的位置,它將看到一個整數常量,它表示文件中行的行號,這是聲明函數的文件。

0

這聽起來像一個Python程序員可能會問的問題,但是您選擇了一個有兩個答案的變體。

第一部分是__LINE__這是一個預處理器宏。顧名思義,預處理是在一些「處理」步驟之前完成的。在這種情況下,它發生在編譯器嘗試編譯代碼之前。前處理包括更換與文件的預處理的內容「的#include」語句,評估和更換宏,#define和#如果報表等

所以當編譯器看到

void logData(... __LINE__) 

上文件的第123行,__LINE__被替換爲常量123。您可以通過使用宏來避免這種情況,例如

enum Level { DEBUG, NOTE, WARNING, ERROR }; 
#define FLD __FILE__, __LINE__, DEBUG 
#define FLN __FILE__, __LINE__, NOTE 
#define FLW __FILE__, __LINE__, WARNING 
#define FLE __FILE__, __LINE__, ERROR 

void log(const char* file_, size_t line_, Level level_, const char* what); 
... 
logData(FLD, "debug message"); 

至於參數是「評估」,調用網站;這樣你就不會碰到Python的

from __future__ import print_function 

def f(inlist, l=[]): 
    if l: 
     l.append("unexpected surprise") 
    l.extend(inlist) 
    return l 

f([1]) 
print(f([2])) 

http://ideone.com/GvmsL6

[1, 'unexpected surprise', 2] 
在C

++

#include <iostream> 
#include <vector> 
#include <string> 

using strvec = std::vector<std::string>; 

strvec f(strvec in, strvec out={}) 
{ 
    if (!out.empty()) 
     out.push_back("unexpected surprise"); 
    out.insert(out.end(), in.cbegin(), in.cend()); 
    return out; 
} 

int main() 
{ 
    f({"a"}); 
    auto vec = f({"b"}); 
    for (auto& str: vec) { 
     std::cout << str << "\n"; 
    } 
} 

http://ideone.com/17ilNL