2015-06-16 4 views
0

Я определил макрос следующим образом:Append строку, представленную __FUNCTION__ макросъемки

#define ADD_TIME_ENTRY(_name_) m_pTimeMeasurement->addTimeEntry(_name_); 

Теперь я хочу, чтобы передать имя функции через ADD_TIME_ENTRY() в какой угодно функции я поставил ADD_TIME_ENTRY()

ADD_TIME_ENTRY(__FUNCTION__) работает отлично но теперь, я хочу добавить «_start» или «_stop» в конце имени функции. Я имею в виду, мне нужно что-то вроде "imageFunction()_start", но я не в состоянии это сделать.

Я хочу сделать это в одной строке т.е.

imageFunction() 
{ 
    ADD_TIME_ENTRY(__FUNCTION__ ....something here...); 
} 
+0

@Serthy: Извините, это не сработало. – skm

+0

@Serthy, '__FUNCTION__' является переменной' const char [] ', а не макросом препроцессора, поэтому вы не можете конкатенировать другую строку. –

ответ

2

Вы можете добавить дополнительный макрос #define STRINGIZE(str) #str и использовать его как это: ADD_TIME_ENTRY(__FUNCTION__ STRINGIZE(start))


Похоже __FUNCTION__ может быть не макро поэтому не так просто объединить его с чем-либо в таком случае. В MSVC2013 это макрос, поэтому его легко комбинировать. Для других компиляторов я бы попробовал следующее:

#define GIVE_ME_NAME(tag) std::string(__FUNCTION__) + STRINGIZE(tag) 

Не особенно эффективный, но рабочий путь.

Пример:

#include <iostream> 
#include <string> 
using namespace std; 

#define STRINGIZE(str) #str 
#define GIVE_ME_NAME(tag) std::string(__FUNCTION__) + STRINGIZE(tag) 

int main() 
{ 
    std::cout << GIVE_ME_NAME(start); 
}; 
+0

Я написал 'ADD_TIME_ENTRY (__ FUNCTION__ APPEND_STR (« start »));' в fuction, но я получаю сообщение об ошибке «ERROR: a»). – skm

+0

@skm, Если ваш 'APPEND_STR' похож на мой' STRINGIZE', тогда удалите кавычки. – ixSci

+0

Я даже пробовал это тоже, но я получаю ту же ошибку. Я использую VS2010 – skm

-1

В __FUNCTION __ имеет тип статического "сопзЬ полукокса __FUNCTION __ []", при вызове m_pTimeMeasurement-> addTimeEntry (_name _) addTimeEntry параметр функции будет «Const символ __FUNCTION__ []».

Таким образом, вы можете объединить два полукокса переменные и передать его

ADD_TIME_ENTRY (strcat (const_cast < символ *> (__FUNCTION __), "_start")); ADD_TIME_ENTRY(strcat(const_cast<char *>( __FUNCTION __)," _stop"));

+0

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

+0

addTimeEntry (_name_) здесь «' _name'_ »является константой, когда эта функция называется значением переменной, будет _name_ =" addTimeEntry() '_start". Const здесь не позволит изменять '_name'_ внутри функции addTimeEntry. –

+1

Да, но «__FUNCTION__» является константой, когда вы указываете. Поэтому добавление к нему сначала вызовет ошибку компилятора (поскольку 'strcat (char *, const char *)'). Первым параметром является «пункт назначения», второй - «источник» (см. [Здесь] (http://www.cplusplus.com/reference/cstring/strcat/)) Если вы отбрасываете constness, не в вашем примере, ваша программа, скорее всего, сбой (в худший момент) из-за повреждения памяти. –

Смежные вопросы