Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/47: Рейтинг темы: голосов - 47, средняя оценка - 4.83
3 / 3 / 1
Регистрация: 30.05.2013
Сообщений: 339
1

Объясните код, использующий макросы __FILE__ и __LINE__

29.10.2014, 11:47. Показов 9213. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
прошу помочь в объяснении того, как работает этот код.
функция ECHO понятно, печатает на экран любое количество аргументов
что такое __FILE__, __LINE__ нашел.

вот код :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
static void ECHO(char *format, ...)
{
    char msg[UF_UI_MAX_STRING_LEN+1];
    va_list args;
    va_start(args, format);
    vsnprintf_s(msg, sizeof(msg), UF_UI_MAX_STRING_LEN, format, args);
    va_end(args);
    UF_UI_open_listing_window();
    UF_UI_write_listing_window(msg);
    UF_print_syslog(msg, FALSE);
}
 
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
 
static int report_error( char *file, int line, char *call, int irc)
{
    if (irc)
    {
        char err[133];
         // irc - код ошибки 
        UF_get_fail_message(irc, err);
        ECHO("*** ERROR code %d at line %d in %s:\n",
            irc, line, file);
        ECHO("+++ %s\n", err);
        ECHO("%s;\n", call);
    }
 
    return(irc);
}
теперь вопросы :
1) есть функция UF_CALL(X). т.е. вместо X мы вставляем какую-либо функцию, но X это переменная же ?
2) что такое #X,(X)
3) почему вообще функция внутри UF_CALL будет выполняться если по идее она всегда должна заменяться функцией
report_error
4)когда функция внутри UF_CALL генерит ошибку каким образом она передается в переменную irc ?
5)и каким образом значение переменной call образуется
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.10.2014, 11:47
Ответы с готовыми решениями:

Исправить код, использующий динамический двумерный массив
#include<iostream> #include<time.h> #include<iomanip> using namespace std; void main(){ ...

Fatal error: Cannot redeclare checks2() (previously declared in file.php on line 45) in file.php on line 45
function result($plist) { foreach ($plist as $arraylist) { $a = getpage($site); //через curl...

Caused by: android.view.InflateException: Binary XML file line #13: Binary XML file line #13: Error inflating class
Caused by: android.view.InflateException: Binary XML file line #13: Binary XML file line #13: Error...

The line endings in the following file are not consistent. Do you want to normalize the line endings?
Добрый день!! У меня периодически выскакивает окно с таким уведомлением: The line endings in the...

6
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
29.10.2014, 12:02 2
UF_CALL - это макрос.
X - параметр макроса.
#X - преобразует параметр макроса в строковой литерал.
(X) - параметр X взятый в скобки.
report_error в макросе UF_CALL ни чем заменятся не должен.
Параметр макроса UF_CALL - код ошибки, который передается в функцию report_error последним параметром.
1
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
29.10.2014, 12:03 3
Лучший ответ Сообщение было отмечено bazelbodayFaron как решение

Решение

C
1
2
3
4
5
6
7
//UF_CALL(strcmp("some unreal", value)); разворачивается в вызов
report_error( // вызывается всегда
                __FILE__, // файл где вызов
                __LINE__, // строка где вызов
                "strcmp(\"some unreal\", value)", // #X -> "X" преобразует X в строку
                (strcmp("some unreal", value))  // тут просто вычисляется значение X
);
2
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
29.10.2014, 18:48 4
Лучший ответ Сообщение было отмечено bazelbodayFaron как решение

Решение

__FILE__ и __LINE__ - это специально зарезервированные имена, встретив которые компилятор вместо них подставляет строковой литерал с именем файла и число с номером строки, в которой написаны эти конструкции

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main (void)
{
  char *s;
  int i;
 
  s = __FILE__;
  printf ("s=%s\n", s);
  i = __LINE__;
  printf ("i=%d\n", i);
  s = __FILE__;
  printf ("s=%s\n", s);
  i = __LINE__;
  printf ("i=%d\n", i);
 
  return 0;
}
при исполнении этого кода на получишь что-то типа:

Код
s=t.c
i=10
s=t.c
i=14
По поводу всего остального читай тут: https://www.cyberforum.ru/blogs/18334/blog100.html
2
3 / 3 / 1
Регистрация: 30.05.2013
Сообщений: 339
29.10.2014, 23:45  [ТС] 5
спасибо !
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
30.10.2014, 00:03 6
Цитата Сообщение от bazelbodayFaron Посмотреть сообщение
что такое __FILE__, __LINE__
C for Dummies #006
0
3 / 3 / 1
Регистрация: 30.05.2013
Сообщений: 339
30.10.2014, 10:56  [ТС] 7
и еще один вопрос, а если у функции несколько параметров, например 4

Добавлено через 9 минут
т.е. #X это будет строка с именем функции ? а (X) это значение которая возвращает функция ?
0
30.10.2014, 10:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2014, 10:56
Помогаю со студенческими работами здесь

LINE и FILE
Есть ли в PHP что-нибудь для получения текущей строки скрипта и названия, выполняемого файла?

Прокомментировать код, использующий потоки
Добрый день пытаюсь разобраться в работе с потоками. Появилось некоторое непонимание. Написал...

Блок использующий код Matlab
Добрый день, возникла такая задача, найти блок в который можно поместить код с matlab, и собственно...

Исправить код, использующий циклы
Здравствуйте, подскажите пожалуйста почему здесь не выводятся итерации цикла while, а только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru