Может любой говорить, когда g ++ заменит __FUNCTION__
'макрос' со строкой, содержащей имя функции? Кажется, что это может заменить его, только когда это имеет, проверяют синтаксическую правильность исходного кода, т.е. следующее не будет работать
#include <whatsneeded>
#define DBG_WHEREAMI __FUNCTION__ __FILE__ __LINE__
int main(int argc, char* argv)
{
printf(DBG_WHEREAMI "\n"); //*
}
так как после предварительной обработки использования
g++ -E test.cc
источник похож
[...]
int main(int argc, char* argv)
{
printf(__FUNCTION__ "test.cc" "6" "\n"); //*
}
и теперь компилятор справедливо подбрасывает, потому что *строка редактора является неправильной.
Там какой-либо путь состоит в том, чтобы вызвать ту замену со строкой к более раннему шагу так, чтобы строка была корректна?
__FUNCTION__
действительно замененный строкой, в конце концов? Или действительно ли это - переменная в скомпилированном коде?
Есть ли способ принудительно выполнить эту замену строкой на более раннем шаге, чтобы строка была правильной?
Нет. __ FUNCTION __
(и его стандартизованный аналог, __ func __
) являются конструкциями компилятора . __ FILE __
и __ LINE __
, с другой стороны, являются конструкциями препроцессора . Невозможно сделать __ FUNCTION __
конструкцией препроцессора, потому что препроцессор не знает языка C ++. Когда исходный файл подвергается предварительной обработке, препроцессор абсолютно не знает, на какую функцию он смотрит, потому что он даже не имеет представления о функциях.
С другой стороны, препроцессор знает , с каким файлом он работает, а также знает, на какую строку файла он смотрит, поэтому он может обрабатывать __ FILE __
и __ СТРОКА __
.
Вот почему __ func __
определяется как эквивалент статической локальной переменной (то есть конструкции компилятора ); только компилятор может предоставить эту функцию.
Вы используете __FUNCTION__
как макрос препроцессора, но это переменная (пожалуйста, прочитайте http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html).
Попробуйте printf("%s", __FUNCTION__)
просто для проверки, и он выведет имя функции.
__FUNCTION__
не является стандартным. Use __func__
. Как сказано в документации, это выглядит так:
<ret-type> function_name( <args> )
{
static const char __func__[] = "function-name";
...
В C/C++ препроцессор превратит "my " "name " is " "Bob"
в строковый литерал "my name is Bob"
; поскольку __FILE__
и __LINE__
являются инструкциями препроцессора, "Мы в строке" __LINE__
передаст компилятору "We are on line 27".
__FUNCTION__
обычно является синонимом __func__
. __func__
можно рассматривать как псевдофункцию, которая возвращает имя функции, в которой она вызывается. Это может сделать только компилятор, а не препроцессор. Поскольку __func__
не вычисляется препроцессором, автоматическая конкатенация не получается. Поэтому, если вы используете printf
, это должно быть сделано printf("имя функции % s", __func__);
printf("%s" __FILE__ __LINE__ "\n", __FUNCTION__);
Да, я знаю, что это не совсем то.
Это то, что вы хотите?
#include <stdio.h>
#define DBG_WHEREAMI(X) printf("%s %s(%d): %s\n",__func__,__FILE__,__LINE__,X)
int main(int argc, char* argv)
{
DBG_WHEREAMI("Starting");
}
Примечание: Поскольку вы отметили это как C++, вам, вероятно, следует использовать iostreams, чтобы убедиться, что это безопасно для типов.