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

    +146

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    // file.h
    template <class T>
    void gg (T i)
    {
     a = i;
    }
    // file1.cpp
    #include "file.h"
    static int a;
    ...
    gg (a);
    // file2.cpp
    static int a;
    ...
    gg (a);
    // компилюем, линкуем - где напёрсточек^W^W в какое a стучится gg<int>?

    >Мне тут некоторые граждане, на пару с некоторыми компиляторами и стандартом наперевес, пытались неубедительно доказывать, что-де такого не позволяет ODR, но пояснить свою мысль в математически непротиворечивой форме что-то не получилось. А между тем, не грех было бы взять пример с презренного пхп и заставить программизда все глобальные переменные, используемые в какой-либо функции, специфицировать в ней явным образом.

    Запостил: CPPGovno, 21 Августа 2011

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

    • file1.cpp точно не скомпилируется. Шаблон не увидит a.
      Инклюд следует переставить после объявления a. И это уже будет симптомом.
      Про file2.cpp вообще нифига не понятно.
      Также полезно понимать разницу между статическими и глобальными переменными.

      Безграмотно, уродливо, с распальцовкой. Минуснул.
      Ответить
      • ответ я думаю намного проще: "а" во время определения темлейта есть просто слово и оно таковым останется - до тех пор пока в неком контексте произойдет инстанциация этого темплейта. уже в контексте, компилер будет генерить код и смотреть что такое "а" (оно не обязательно должно быть переменной) и какой код вообще надо генерировать.
        Ответить
    • до инстанизации шаблоны проходят только синтаксическую проверку, так что усе должно скомпилиться

      за -> Также полезно понимать разницу между статическими и глобальными переменными
      +1
      Ответить

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