LINUX.ORG.RU

Macros + inline + GCC


0

0

Привет народ!

Вот такая проблема:

У меня есть ф-ция объявленая как inline:

inline bool _debug ( std::string name ) {
std::cout << "Error in " << "'" << __FILE__ << "'" << " line: " << __LINE__ << std::endl;
return false;
}

Тут есть макроссы __FILE__ и __LINE__.
Но когда происходит ошибка - то вместо файла и строки где произошла ошибка получаю файл и строку где реализована эта ф-ция.

Компилятор gcc 4.2.3

Пробовал -finline-functions, -fkeep-inline-functions не помогает.

То есть выходит она фактически не вставляет текст на место вызова как должна была бы делать.

Есть идеи как это побороть?
Спасибо.

anonymous


а почему собственно inline ф-я должна подставлять FILE/LINE? это не макрос.

ps: ну и борется соотв. переносом кода из ф-и в макрос.

// wbr

klalafuda ★☆☆
()

Дизассемблером смотрел? То, что макросы __FILE__ и __LINE__ раскрываются на месте обьявления ещё не значит, что функция не inline'ится.

naryl ★★★★★
()

1. нафиг возвращаемое значеное bool?

2. какой смысл передавать не используемый аргумент?

3. inline здесь вообще не нужен. читайте стандарт.

#DEFINE _debug std::cout << "Error in " << "'" << __FILE__ << "'" << " line: " << __LINE__ << std::endl

anonymous
()
Ответ на: комментарий от anonymous

Я специально укоростил ф-цию. Там большая ф-ция которая много чего делает..

Чтобы не отвлекать внимания на не нужное оставил главное.

anonymous
()
Ответ на: комментарий от naryl

>Дизассемблером смотрел? То, что макросы __FILE__ и __LINE__ >раскрываются на месте обьявления ещё не значит, что функция не >inline'ится.

Если б я умел им работать )

anonymous
()

потому что сначала отрабатывает препроцессор, который разворачивает __FILE__ и __LINE__.

# gcc -E test.c > test.c.tmp
# less test.c.tmp

alex_custov ★★★★★
()

inline bool real_debug ( std::string name, const char *f, int l ) { 
 std::cout << "Error in " << "'" << f << "'" << " line: " << l << std::endl; 
 return false; 
} 
 
#define _debug(name) real_debug(name, __FILE__, __LINE__)

Примерно так.

Deleted
()
Ответ на: комментарий от alex_custov

>потому что сначала отрабатывает препроцессор, который разворачивает >__FILE__ и __LINE__.

Точно.... что-то забыл про это.
Ну и как быть?
Макрос не подкатит, так как ф-ция большая.

Есть идеи?

anonymous
()
Ответ на: комментарий от anonymous

>>Ну и как быть? >>Макрос не подкатит, так как ф-ция большая. >>Есть идеи?

См. моё сообщение выше. Кстати при этом inline можно вообще убрать, тем более что ф-ция большая.

Deleted
()
Ответ на: комментарий от Deleted

>inline bool real_debug ( std::string name, const char *f, int l ) {
> std::cout << "Error in " << "'" << f << "'" << " line: " << l << >std::endl;
> return false;
>}

>#define _debug(name) real_debug(name, __FILE__, __LINE__)

>Примерно так.

Не примерно а точно так! Работает )))))
Золотые люди на форуме.

Большое спасибо!

anonymous
()
Ответ на: комментарий от Deleted

> Кстати при этом inline можно вообще убрать, тем более что ф-ция большая.

Правильно, так и сделал.
Спасибо за помощь и всем кто помогал.

anonymous
()
Ответ на: комментарий от alex_custov

> mironov_ivan ответил

не успеваю отвечать )))

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.