Слышал что там что-то типа, разные генерации функций имён получаются для си и си++, на так и не понял, как это и зачем это. Обьясните, плиз. ИЛИ дайте линк почитать. #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* Functions which govern the 6502's execution */ extern void nes6502_reset(void); extern int nes6502_execute(int total_cycles); extern void nes6502_nmi(void); extern void nes6502_irq(void); extern void nes6502_pending_irq(void); extern uint8 nes6502_getbyte(uint32 address); extern uint32 nes6502_getcycles(boolean reset_flag); extern void nes6502_burn(int cycles); /* Context get/set */ extern void nes6502_setcontext(nes6502_context *cpu); extern void nes6502_getcontext(nes6502_context *cpu); #ifdef __cplusplus } #endif /* __cplusplus */ Типа, если объявлен __cplusplus то это выполняетс как си. А как узнать - __cplusplus определёно это или нет . или это зависит от компилятора?
__cplusplus определена если компилятор - С++ и не определена если С extern "C" С++ компилятор "по-особому" именует функции(скорее всего с учетом пространства имен - передаваемых/возвращаемых аргументов и тп), т к поддерживает полиморфизм С компилятор не манглит имена функций, т к поддержки полиморфизма в нем нет
Эээээээ... а почему тогда куча функций в проекте описаны без этой директивы, а тут она потребовалась? Можете объяснить?
Для "обратной совместимости". Функции, объявленные с директивой extern "C" могут быть вызваны из С кода (поддерживается тот же стиль именования). Без этой директивы компилятор будет "декорировать" имена так, чтобы в них содержалась информация о типе и количестве параметров функции.
ajak Агнер Фог (Agner Fog) все очень хорошо описал для многих компилеров. Рекомендую. Живет здесь: http://www.agner.org/optimize/. Манглинг и соглашения вызова описаны в мануале 5. Calling conventions for different C++ compilers and operating systems