Я получаю функцию GL в моем коде, используя wglGetProcAddress. Автор руководства (https://sites.google.com/site/opengltutorialsbyaks/introduction-to-opengl-3-2—tutorial-01) говорит, что мне нужно определить такие функции:
extern PFNGLCREATEPROGRAMPROC glCreateProgram;
Используя ключевое слово extern. Но я пытался без него, и он работает (компиляция успешно завершена, и программа успешно использует функцию). Зачем мне это ключевое слово вообще и в этом случае?
extern
сообщает компилятору, что определенное имя находится в другом модуле компиляции.
Глобальное определение функции extern
по умолчанию. Итак, это объясняет, почему это сработало в вашем случае.
Место, где вы бы иметь использовать его, это при определении и объявлении глобальных переменных.
Если есть глобальная переменная, о которой необходимо знать единицу компиляции (например, мьютекс), необходимо сделать ее доступной в упомянутом модуле. Но если вы сделаете это:
int a; // in global scope
Компилятор попытается выделить для него память в статической памяти программ и выдаст ошибку повторного определения. extern
приходит к нам на помощь здесь. Написав:
extern int a;
Мы предоставляем объявление для глобального, но не выделяем память для него.
Но так как такое использование глобалов не рекомендуется, вы редко увидите его в использовании.
Других решений пока нет …