Как понять эту конструкция на си

Тема в разделе "WASM.BEGINNERS", создана пользователем ajak, 13 май 2009.

  1. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Слышал что там что-то типа, разные генерации функций имён получаются для си и си++, на так и не понял, как это и зачем это. Обьясните, плиз. ИЛИ дайте линк почитать.


    #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 определёно это или нет . или это зависит от компилятора?
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    http://www.google.ru/search?hl=ru&q=extern+%22C
    первая ссылка, если читать внимательно
     
  3. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    __cplusplus
    определена
    если компилятор - С++
    и не определена если С

    extern "C"
    С++ компилятор "по-особому" именует функции(скорее всего с учетом пространства имен - передаваемых/возвращаемых аргументов и тп), т к поддерживает полиморфизм
    С компилятор не манглит имена функций, т к поддержки полиморфизма в нем нет
     
  4. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Эээээээ... а почему тогда куча функций в проекте описаны без этой директивы, а тут она потребовалась? Можете объяснить?
     
  5. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Для "обратной совместимости". Функции, объявленные с директивой extern "C" могут быть вызваны из С кода (поддерживается тот же стиль именования). Без этой директивы компилятор будет "декорировать" имена так, чтобы в них содержалась информация о типе и количестве параметров функции.
     
  6. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    же стиль именования
    А гдеможно посмотреть как он кодирует функции в зависимости от компилоятора
     
  7. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    h**p://w*w.google.ru/search?q=name+mangling
    h**p://en.wikipedia.org/wiki/Name_mangling
     
  8. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    ajak
    Агнер Фог (Agner Fog) все очень хорошо описал для многих компилеров. Рекомендую. Живет здесь: http://www.agner.org/optimize/. Манглинг и соглашения вызова описаны в мануале 5. Calling conventions for different C++ compilers and operating systems