Как проверить, можно ли использовать __PRETTY_FUNCTION__? - PullRequest
6 голосов
/ 12 ноября 2010

...../PluginLoader.h:34: multiple definition of 'Dummy_Func_For_Generating_FUNCTION_NAME_Macro()'

Вышеприведенная ошибка выводится для приведенного ниже кода.Я включил охрану в свое дело.А все остальное компилируется нормально.

РЕДАКТИРОВАТЬ: То, что я пытался добиться, чтобы проверить, был ли определен __PRETTY_FUNCTION__, и если это было так, используйте его позже в коде с помощью макроса FUNCTION_NAME (для целей ведения журнала).Если __PRETTY_FUNCTION__ не определено, используйте следующую лучшую вещь и так далее.Однако полученные ответы заставили меня понять, что это невозможно.Итак, если __PRETTY_FUNCTION__ и все эти другие не макросы, то что это?И как я могу проверить, есть ли у определенной реализации один из них или нет?

    void Dummy_Func_For_Generating_FUNCTION_NAME_Macro()
    {
#ifndef FUNCTION_NAME
    #ifdef __PRETTY_FUNCTION__
        #define FUNCTION_NAME __PRETTY_FUNCTION__
    #elif __FUNCTION__
        #define FUNCTION_NAME __FUNCTION__
    #elif __func__
        #define FUNCTION_NAME __func__
    #else
        #define FUNCTION_NAME ""
    #endif
#endif
    }

Ответы [ 4 ]

13 голосов
/ 12 ноября 2010

void Dummy_Func_For_Generating_FUNCTION_NAME_Macro() - это функция, а не макрос.Функции не создают макросы.Макросы разрешаются на этапе препроцессора, а функции - на этапе компиляции.Удалите определение функции и оставьте только блок #ifndef.

Используйте компилятор, определяющий макросы, чтобы выяснить, какую функцию, идентифицирующую макрос, использовать.Например:

#ifdef _MSC_VER // Visual Studio
    #define FUNCTION_NAME __FUNCTION__
#endif
5 голосов
/ 12 ноября 2010

__PRETTY_FUNCTION__ и __FUNCTION__ не являются макросами препроцессора, такими как __LINE__ или __FILE__, но магическими константами они недоступны во время препроцессора, но позже во время компиляции (в области действия функции).

Так что все, что вы пытаетесь сделать с макросами здесь, вероятно, все равно не сработает.

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

заголовочный файл xx.h

#ifndef H_XX_H
#define H_XX_H

#ifndef FUNCTION_NAME
    void Dummy_Func_For_Generating_FUNCTION_NAME_Macro()
    {
    #ifdef __PRETTY_FUNCTION__
        #define FUNCTION_NAME __PRETTY_FUNCTION__
    #elif __FUNCTION__
        #define FUNCTION_NAME __FUNCTION__
    #elif __func__
        #define FUNCTION_NAME __func__
    #else
        #define FUNCTION_NAME ""
    #endif
   ;
   }
#endif
#endif

Исходный файл xx.c

#include <stdio.h>
#include "xx.h"

main(){
    printf("%s\n", FUNCTION_NAME);
}
0 голосов
/ 15 июля 2013

Поместите вашу функцию в anonymous namespace.Это исключит определение duplicate function errors.Т.е.

 namespace {
     function goes here
  }
0 голосов
/ 12 ноября 2010

Раньше я сталкивался с этой проблемой, которая вызвана подключенным диском:

subst R: C: \ Source \

Test.cpp:

 #include "C:\Source\PluginLoader.h"  
 #include "R:\PluginLoader.h"

Теперь, если вы включите guard is #pragma один раз, компилятор не настолько умен, чтобы знать, что они являются действительным одним файлом, что вызывает ошибку переопределения.

Однако я не уверен,это ваша проблема, так как она зависит от:

  • Вы включаете как с виртуального диска, так и с физического диска
  • Ваш включаемый защитник один раз - #pragma, а не макрос защиты

.

...