Это звучит как вопрос, который может задать программист на 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
'__LINE__' расширяется препроцессором, до того, как код обрабатывается собственно компилятором. Компилятор видит только 'int line = 123' (или любой номер строки). –