1. C++ / Говнокод #17001

    +135

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    void SoundService::stop(){
        if (mOutputMixObj != NULL) {
            (*mOutputMixObj)->Destroy(mOutputMixObj);
            mOutputMixObj = NULL;
        }
        if(mEngineObj != NULL){
            (*mEngineObj)->Destroy(mEngineObj);
             mEngineObj = NULL; mEngine = NULL;
        }
    }

    Случайно нашёл в книге по Android NDK, открытой на случайной странице.

    Запостил: tehned, 30 Октября 2014

    Комментарии (13) RSS

    • А внутри метода Destroy стоит проверка на то, что переданный аргумент есть this.
      И если нет, то кидает exception: дескать по-контракту сюда только this.
      Ответить
    • Вероятно, mOutputMixObj - сишная структура с указателями на функции. Весь jni так выглядит.
      Ответить
      • Почему тогда оберточку не сделать? Плюсы же.

        Хотя стойте! Мы же говорим про андроид. Там и в SDK-то сплошной int в качестве аргумента, ручной каст и полное отсутствие генериков. Очевидно что плюсовикам повезло еще меньше.

        А JNI так сделан чтоб на чистых сях писалось лучше, имхо.
        Ответить
        • > чтоб на чистых сях писалось лучше, имхо
          Да просто у крестов нету вменяемого ABI.

          Из-за этого, порой, доходит вообще до маразма - авторы либ очкуют юзать STL контейнеры из-за того, что кому-то может захотеться подгрузить джве DLL'ки, собранные разными компилерами...
          Ответить
          • > Да просто у крестов нету вменяемого ABI.

            конечно есть - на линухах и прочих *нихах и бсдях. (кланг недавно последнии грабли пофиксил и теперь вроде даже можно мешать объектные файлы от гцц и кланга в одном проекте. мешать можно было и раньше, но были где-то там какие-то глюки.)

            но не на ваших грёбаных виндах, где мелкософт все меняет постоянно с каждым релизом виндов/студии. эти идиоды даже msvcrt стабильной сделать не могут. а вы тут о крестовом ABI мечтаете...
            Ответить
            • > > Да просто у крестов нету вменяемого ABI.
              > о крестовом ABI мечтаете...
              Если вдруг кто-то не следит, то Саттер полгода назад написал n4028.
              http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4028.pdf
              tl;d: я, собственно, тоже не читал, а если и читал, то нихуя не понял. Там что-то про портабельный extern "abi" и std::abi::*.
              Ответить
              • там все очень просто. но фишка в том что мелкософт на стандарты чхать хотел.

                да то что там саттер предлагает просто никогда не полетит. он предлагает более или менее продублировать STL, для чего и предлагает отдельный неймспэйс std::abi::*. грабли двух слегка разных типов контейнеров - теперь прям из коробки.

                но все это ломается на том что ОСь - the OS Platform Owner - что-то еще должна делать. т.к. эта проблема существует преимущественно на виндах, и мелкософт уже давно всех с крестов на фальшивое до пересадил, то им скрее всего глубоко до лампочки. (тем более что версионирование виндов/студий/рантаймов просто через Ж, то это вполне вероятно на виндах вообще не реализуемо.)

                учитывая сколько он там пользуется словом "strawman", я думаю что саттер знал что это не реально, но он просто хотел хотя бы описать теоретическое - и технически реализуемое - решение проблемы.

                но занимательно чтиво, тем не менее.
                Ответить
              • Вот и stl изобрели, а счастья всё нет…
                Ответить
        • > Почему тогда оберточку не сделать? Плюсы же.
          В JNI есть пара ифдефов, которые добавляют методы, типа такого
          #ifdef __cplusplus
          
              jint GetVersion() {
                  return functions->GetVersion(this);
              }
          Про андроид не скажу, может и там есть, но автор не знал.
          Ответить
    • Минусы успешно въёбанны.
      Ответить
      • "Въёбаны", школьник ты неграмотный, там одна "н"!!!
        Ответить
        • Зачётный батхёрт. Въебал инкремент от нуля.
          Ответить

    Добавить комментарий