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

 

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

#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).
 
Viktar Dzemikhau:

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

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

 
Ihor Herasko:

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

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

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

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

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

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

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

 
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);
 

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

void SomeFunc(void);

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

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

 

В принципе да, сигнатура как-бы не меняется т.к. типы не меняются. Так что нормально. Но дальше, нашёлся ещё 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;}\

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

 
Viktar Dzemikhau:

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

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

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

 

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

...return res != 0;}\

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

 
Andrei Novichkov:

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

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

Я это понял. Пришлось чутка въехать в макросы. Пришлось..))