А API-функции обязательно "декларировать"?

Дмитрий77
Дата: 26.06.2015 08:26:37
Т.е. например (везде extern "C" ):

в .h
BOOL __stdcall CPP7_Get_KeyDate(BYTE ModeId, WORD * Day, WORD * Month, WORD * Year);

в .cpp
BOOL __stdcall CPP7_Get_KeyDate(BYTE ModeId, WORD * Day, WORD * Month, WORD * Year)
{ 
  return GetKeyDate(ModeId, Day, Month, Year);
}

Но без .h тоже компилируется и работает.

А вот если вот так (со структурой):
в .h
BOOL __stdcall CPP7_Check_Key(char* Key, char* Name, PMODE_STATUS ModeStatus);

в .cpp
BOOL __stdcall CPP7_Check_Key(char* Key, char* Name, PMODE_STATUS ModeStatus)
{ 
  return CheckKey(Key, Name, ModeStatus);
}

то еще и ругается
1>.\License.cpp(28) : error C2733: second C linkage of overloaded function 'CPP7_Check_Key' not allowed
1> .\License.cpp(27) : see declaration of 'CPP7_Check_Key'

если убрать, то компилируется и работает

Мож .h вообще выкинуть?
egorych
Дата: 26.06.2015 10:44:59
Дмитрий77
везде extern "C"
...
то еще и ругается
1>.\License.cpp(28) : error C2733: second C linkage of overloaded function 'CPP7_Check_Key' not allowed
1> .\License.cpp(27) : see declaration of 'CPP7_Check_Key'
так ругается на перегрузку, которая в С не поддерживается.

а "работает" что значит?
Дмитрий77
Дата: 26.06.2015 12:14:47
egorych
так ругается на перегрузку, которая в С не поддерживается.

Только в одном случае ругается, а в другом нет.
Мне всегда казалось, что в C/C++ должно быть
1) Definition -собственно код ф-ции
2) Declaration -заголовок с параметрами (без кода) и точка с запятой на конце

Хотя по логике, если я ее не вызываю внутри самой dll, наверно и декларировать ее ни к чему.

egorych
а "работает" что значит?

Ну, значит вызывается из другого приложения (.Net в моем случае) и возвращает правдоподобный результат.
MasterZiv
Дата: 26.06.2015 12:26:24
Дмитрий77,

декларировать нужно.
особенно в С++, где функции по умолчанию нифига не extern c
egorych
Дата: 26.06.2015 12:29:14
Дмитрий77
Мне всегда казалось, что в C/C++ должно быть
1) Definition -собственно код ф-ции
2) Declaration -заголовок с параметрами (без кода) и точка с запятой на конце
в С декларация - необязательна, но рекомендована, в С++, насколько помню, обязательна.
Дмитрий77
Ну, значит вызывается из другого приложения (.Net в моем случае) и возвращает правдоподобный результат.
а ты обе-две функции из Net можешь вызвать одновременно?
Дмитрий77
Дата: 26.06.2015 13:03:49
egorych
в С декларация - необязательна, но рекомендована

только почему-то ругается на "дубликат", и только тогда когда структура в параметре.

egorych
а ты обе-две функции из Net можешь вызвать одновременно?

в смысле 2 разных (с разным именем)?
и что значит одновременно?
ну, последовательно на кнопочки нажимаю (в продакшн тоже своя логика), разные вызываю
потоками не увлекаюсь
все что сделал, все работает
MasterZiv
Дата: 26.06.2015 14:06:05
egorych
2) Declaration -заголовок с параметрами (без кода) и точка с запятой на конце
в С декларация - необязательна, но рекомендована, в С++, насколько помню, обязательна.[/quot]

Дело не в этом, а в том, что любое определение является и декларацией (объявлением) тоже.
Но просто extern C не проставить по-нормальному без объявления.
Дмитрий77
Дата: 26.06.2015 14:27:58
MasterZiv
особенно в С++, где функции по умолчанию нифига не extern c

у меня как в .cpp, так и в .h все находится внутри блоков

extern "C" {
...
}; // extern "C"
MasterZiv
Дата: 26.06.2015 14:50:20
Дмитрий77,

Ну ок, так в чём проблема оставить и определение, и объявление ?
egorych
Дата: 26.06.2015 14:50:26
Дмитрий77:
>>в смысле 2 разных (с разным именем)?
нет, с одинаковым, но с разными параметрами. Ты ж говоришь, что компилируется у тебя.
>>и что значит одновременно?
без пересборки библиотеки. Сначала одну функцию вызвал, потом - другую. Интересно, вызовятся разные функции, или одна и та же. Си умеет ведь int в указатель молча преобразовывать. WORD - это инт же, а PMODE_STATUS - указатель.