g ++ __ ФУНКЦИОНИРУЮТ __ время замены

Может любой говорить, когда 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__ действительно замененный строкой, в конце концов? Или действительно ли это - переменная в скомпилированном коде?

8
задан Brian Tompsett - 汤莱恩 15 June 2016 в 17:42
поделиться

6 ответов

Есть ли способ принудительно выполнить эту замену строкой на более раннем шаге, чтобы строка была правильной?

Нет. __ FUNCTION __ (и его стандартизованный аналог, __ func __ ) являются конструкциями компилятора . __ FILE __ и __ LINE __ , с другой стороны, являются конструкциями препроцессора . Невозможно сделать __ FUNCTION __ конструкцией препроцессора, потому что препроцессор не знает языка C ++. Когда исходный файл подвергается предварительной обработке, препроцессор абсолютно не знает, на какую функцию он смотрит, потому что он даже не имеет представления о функциях.

С другой стороны, препроцессор знает , с каким файлом он работает, а также знает, на какую строку файла он смотрит, поэтому он может обрабатывать __ FILE __ и __ СТРОКА __ .

Вот почему __ func __ определяется как эквивалент статической локальной переменной (то есть конструкции компилятора ); только компилятор может предоставить эту функцию.

15
ответ дан 5 December 2019 в 07:10
поделиться

Вы используете __FUNCTION__ как макрос препроцессора, но это переменная (пожалуйста, прочитайте http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html).

Попробуйте printf("%s", __FUNCTION__) просто для проверки, и он выведет имя функции.

3
ответ дан 5 December 2019 в 07:10
поделиться

__FUNCTION__ не является стандартным. Use __func__. Как сказано в документации, это выглядит так:

<ret-type> function_name( <args> )
{
    static const char __func__[] = "function-name";
    ...
2
ответ дан 5 December 2019 в 07:10
поделиться

В 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__);

2
ответ дан 5 December 2019 в 07:10
поделиться
printf("%s" __FILE__ __LINE__ "\n", __FUNCTION__);

Да, я знаю, что это не совсем то.

0
ответ дан 5 December 2019 в 07:10
поделиться

Это то, что вы хотите?

#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, чтобы убедиться, что это безопасно для типов.

1
ответ дан 5 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: