Что означает подобный define ?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Viktar Dzemikhau
3386
Viktar Dzemikhau  

Пришлось разбирать один код. Библиотеку одного китайца, как я понял. Но не суть. Я заметил там, одну интересную, и. довольно-таки странную вещь. Вот есть как-то так:

#ifdef __X64__
#define intptr_t long
#else
#define intptr_t int
#endif

Здесь всё понятно, конечно. А вот дальше начинается самое интересное.. Всё показывать не буду т.к. строк много, и, навряд ли, кто-то очень желает всё то, что я лопачу перелопатить без надобности. Но вот момент, который меня смутил:

intptr_t sqlite3_column_decltype(intptr_t pStmt, int);
intptr_t sqlite3_column_database_name(intptr_t, int);

Если в 1-ой из этих функций:

intptr_t sqlite3_column_decltype(intptr_t pStmt, int);

intptr_t pStmt это, соответственно, тип 1-го параметра (intptr_t), а pStmt - сам параметр. Второй параметр я вообще понял что это за такое..

Во-второй функции 2 параметра или типа того вообще странно выглядят.

intptr_t sqlite3_column_database_name(intptr_t, int);

Как это понимать? Почему в кавычках лишь типы? Самих параметров т.е. потенциальных значений нет вообще.

Обычно то, параметры передаются как тип параметр (int firstValue, float secondValue, long thirdValue), а не как параметр без типа или тип без параметра (int, float, long).
Ihor Herasko
21738
Ihor Herasko  
Viktar Dzemikhau:

Обычно то, параметры передаются как тип параметр (int firstValue, float secondValue, long thirdValue), а не как параметр без типа или тип без параметра (int, float, long).

При объявлении функции вполне достаточно указать типы передаваемых аргументов. Их имена не являются важными. Имена нужны при реализации функции, чтобы можно было использовать аргументы в коде.

Viktar Dzemikhau
3386
Viktar Dzemikhau  
Ihor Herasko:

При объявлении функции вполне достаточно указать типы передаваемых аргументов. Их имена не являются важными. Имена нужны при реализации функции, чтобы можно было использовать аргументы в коде.

Первый раз такое вижу. Видимо китайцы чаще так пишут. Только у него и заметил я подобное))
Vitaly Muzichenko
14094
Vitaly Muzichenko  
Viktar Dzemikhau:
Первый раз такое вижу. Видимо китайцы чаще так пишут. Только у него и заметил я подобное))

При компиляции меняет тип переменной.

Управлять так:

#ifndef __X64__
   #define __X64__ // если указано __X64__, то компиляция создаст переменную "intptr_t" с типом long, иначе с типом int
#endif

#ifdef __X64__
#define intptr_t long
#else
#define intptr_t int
#endif

Это вполне нормальная конструкция

Ihor Herasko
21738
Ihor Herasko  
Viktar Dzemikhau:
Первый раз такое вижу. Видимо китайцы чаще так пишут. Только у него и заметил я подобное))

В примерах от MQ такое тоже встречается. Смотрите файл MQL4\Scripts\Examples\DLL\DLLSampleTester.mq4. Там есть объявление функций:

int    GetIntValue(int);
double GetDoubleValue(double);
string GetStringValue(string);
double GetArrayItemValue(double &arr[],int,int);
bool   SetArrayItemValue(double &arr[],int,int,double);
double GetRatesItemValue(MqlRates &rates[],int,int,int);
Andrei Novichkov
8179
Andrei Novichkov  

Что тут такого странного. Разве никто не видел такого объявления:

void SomeFunc(void);

И здесь что то подобное.

Пишем SomeFunc (int, float), получаем, что к самим параметрам в теле функции обратиться нельзя. Такое редко нужно, но бывают случаи.

Viktar Dzemikhau
3386
Viktar Dzemikhau  

В принципе да, сигнатура как-бы не меняется т.к. типы не меняются. Так что нормально. Но дальше, нашёлся ещё 1 интересный ммоент. Думаю сюда его тоже приведу:

// db config
#define DB_CONFIG(Name, MACRO) \
bool     is##Name##Enabled() const {int res; sqlite3_db_config(m_ref,MACRO, -1, res); return res != 0;}\

Символ \ вставляется после тела функции, даже после кавычек. Что это за хрень вообще? Что-то меня плющит уже пару ндей от таких ситуаций..

Artyom Trishkin
Модератор
56388
Artyom Trishkin  
Viktar Dzemikhau:

В принципе да, сигнатура как-бы не меняется т.к. типы не меняются. Так что нормально. Но дальше, нашёлся ещё 1 интересный ммоент. Думаю сюда его тоже приведу:

Символ \ вставляется после тела функции, даже после кавычек. Что это за хрень вообще? Что-то меня плющит уже пару ндей от таких ситуаций..

Перенос строки в макросе

Andrei Novichkov
8179
Andrei Novichkov  

Именно. Это перенос строки. А самый последний символ вот здесь:

...return res != 0;}\

это просто от лукавого )

Viktar Dzemikhau
3386
Viktar Dzemikhau  
Andrei Novichkov:

Именно. Это перенос строки. А самый последний символ вот здесь:

это просто от лукавого )

Я это понял. Пришлось чутка въехать в макросы. Пришлось..))
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий