Как найти название текущей функции во времени выполнения?

Это может быть проблемой параллелизма потока, если вы обрабатываете все в основном потоке, он будет зависать до полной загрузки ресурса. Я рекомендую отправить его в последовательную очередь в фоновом потоке, а после завершения загрузки отправить в основной поток.

пример тому:

-(void) GCDSerialQueuesDownload
{
    NSString * anURL = @"myURL.com";
    dispatch_queue_t serialQueue = dispatch_queue_create("com.dispatch.feed.serial.queue",DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t mainQueue = dispatch_get_main_queue();

    void (^addFeedBlock)(NSString*) = ^(NSString* url) {
        //your download here
        dispatch_async(mainQueue,^{
            //after finish you download
        });
    };

    dispatch_async(serialQueue, ^{
        addFeedBlock(anURL);
    });

}

Хороший источник

36
задан Deduplicator 9 March 2015 в 14:41
поделиться

6 ответов

Ваш макрос может содержать __FUNCTION__ макрос. Не сделайте ошибку, имя функции будет вставлено в расширенный код во время компиляции, но это будет корректное имя функции для каждого вызова к Вашему макросу. Таким образом, "кажется", что это происходит во времени выполнения ;)

например.

#define THROW_IF(val) if (val) throw "error in " __FUNCTION__

int foo()
{
    int a = 0;
    THROW_IF(a > 0); // will throw "error in foo()"
}
52
ответ дан Assaf Lavie 27 November 2019 в 05:15
поделиться

Макрос препроцессора C++ __FUNCTION__ дает название функции.

Обратите внимание, что при использовании этого это действительно не получает имя файла, номер строки или имя функции во времени выполнения. Макросы расширены препроцессором и скомпилированы в.

__FUNCTION__ макрос, как __LINE__, и __FILE__, часть стандарта языка и является портативной.

Пример программы:

#include <iostream>
#using namespace std;

void function1()
{
        cout << "my function name is: " << __FUNCTION__ << "\n";
}
int main()
{
        cout << "my function name is: " << __FUNCTION__ << "\n";
        function1();
        return 0;
}

вывод:

my function name is: main
my function name is: function1
23
ответ дан ephemient 27 November 2019 в 05:15
поделиться

Нет никакого стандартного решения. Однако BOOST_CURRENT_FUNCTION является портативным для всех практических целей. Заголовок не не зависит ни от одного из других заголовков Повышения, так может использоваться автономный, если издержки целой библиотеки недопустимы.

18
ответ дан fizzer 27 November 2019 в 05:15
поделиться
10
ответ дан Werner Henze 27 November 2019 в 05:15
поделиться

Можно использовать __FUNCTION__ макрос, который во время компиляции будет расширен до названия функции.

Вот пример того, как использовать его в утверждать макросе.

#define ASSERT(cond) \
    do { if (!(cond)) \
    MessageBoxFunction("Failed: %s in Function %s", #cond, __FUNCTION__);\
    } while(0)

void MessageBoxFunction(const char* const msg,  ...)
{
    char szAssertMsg[2048];

    // format args
    va_list vargs;
    va_start(vargs, msg);
    vsprintf(szAssertMsg, msg, vargs);
    va_end(vargs);

    ::MessageBoxA(NULL, szAssertMsg, "Failed Assertion", MB_ICONERROR | MB_OK);
}
5
ответ дан Werner Henze 27 November 2019 в 05:15
поделиться

В GCC вы можете использовать макрос __ PRETTY_FUNCTION __ .
У Microsoft также есть эквивалентный макрос __ func __ , хотя у меня его нет, чтобы попробовать.

например, чтобы использовать __ PRETTY_FUNCTION __ , поместив что-то подобное в начало ваших функций, и вы ' Я получу полную трассировку

void foo(char* bar){
  cout << __PRETTY_FUNCTION__ << std::endl
}

, которая выведет

void foo(char* bar)

. У вас также есть макросы __ FILE __ и __ LINE __ , доступные во всех стандартных компиляторах c / c ++, если вы хотите вывести еще больше информации .

На практике у меня есть специальный класс отладки, который я использую вместо cout. Определив соответствующие переменные среды, я могу получить полную трассировку программы. Вы могли бы сделать что-то подобное. Эти макросы невероятно удобны, и действительно здорово иметь возможность включать подобную выборочную отладку в полевых условиях.

EDIT: очевидно __ func __ является частью стандарта? не знал этого. К сожалению, он дает только имя функции, но не параметры. Мне нравится __ PRETTY_FUNC __ gcc, но он не переносится на другие компиляторы.

GCC также поддерживает __ FUNCTION __ .

8
ответ дан 27 November 2019 в 05:15
поделиться
Другие вопросы по тегам:

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