static変数を関数を使って初期化したと関数を抜けると0になる原因が知りたい

以下のコードの//////コメント部内部のコードなのですがSDL::render変数は静的変数なのですが提示のInitialize()関数内ではアドレスが挿入されることを確認しまして、その後Main関数内で値を確認したころになっているのですがこれはなぜでしょうか?
静的変数はMain関数が実行される前に初期化されるののでその初期化の後にアドレスを代入しているのですが理由が知りたいです。
この初期化関数を含むContextクラスを作成して静的変数ではなく普通の変数にすることで問題は解決したのですが理由が知りたいです

初期化関数
bool SDL::Initialize(const char* title,const glm::ivec2 size) { if(SDL_Init(SDL_INIT_VIDEO) < 0) { std::cerr<< SDL_GetError() << std::endl; return false; } int flags = IMG_INIT_JPG|IMG_INIT_PNG; int initted = IMG_Init(flags); if( (initted&flags) != flags) { std::cerr<< IMG_GetError() << std::endl; } window = SDL_CreateWindow(title, SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED, size.x,size.y, 0); if (window == nullptr) { std::cerr<< SDL_GetError() << std::endl; SDL_DestroyWindow(window); SDL_Quit(); return false; } render = SDL_CreateRenderer(window,-1,0); if (render == NULL) { std::cerr<< SDL_GetError() << std::endl; SDL_DestroyWindow(window); SDL_Quit(); return false; } //////////////////////////////////////////////////////// std::cout<<render<<std::endl; //////////////////////////////////////////////////////// //変数初期化 // key = KeyCode::None; windowSize = size; return true; }
Main.cpp
#include <iostream> #define SDL_MAIN_HANDLED #include "Init.hpp" int main() { SDL::Initialize("Game",glm::ivec2(640,480)); ///////////////////////////////////////////////////////////// std::cout<<SDL::render<<std::endl; ////////////////////////////////////////////////////////////// while(true) { SDL_RenderClear(SDL::render); SDL_Rect rect; rect.x = 100; rect.y = 100; rect.w = 200; rect.h = 100; SDL_SetRenderDrawColor(SDL::render, 0, 0xFF, 0, SDL_ALPHA_OPAQUE); // 矩形の描画色を設定する(ここでは緑) SDL_RenderFillRect(SDL::render, &rect); // 矩形を塗りつぶして描画する SDL_RenderPresent(SDL::render); } SDL::Finalize(); return 0; }
Init.hpp
#ifndef ___SDL_HPP___ #define ___SDL_HPP___ #include <SDL2/SDL.h> #include <SDL2/SDL_image.h> #include <iostream> #include <glm/glm.hpp> namespace SDL { static SDL_Window* window = nullptr; static SDL_Renderer* render = nullptr; enum class KeyCode { Up, Down, Left, Right, None, Escape, }; void RenderClear(); //クリア void RenderPresent(); //描画 void KeyEvent(); //キー入力 十字キー bool GetInputKey(int keyCode); bool GetInputKeyDown(int keyCode); static bool Initialize(const char* title,const glm::ivec2 size); //初期化 void Finalize(); //終了処理 int GetRandom(const int n); //乱数 取得 glm::ivec2 GetWindowSize(); //ウインドウサイズ 取得 float GetDeltaTime(); //デルタタイムを取得 }; #endif

コメントを投稿

0 コメント