2015-06-23 1 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 и операторами #if и т.д.

Так что, когда компилятор видит

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"); 

Что касается аргументов «оценивается», вызывать сайт; так что вы не столкнетесь с Пайтона

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

Смежные вопросы