c++头文件中定义的全局变量未被任何cpp文件引用,如何禁止编译器优化掉该变量

穿女装的程序员 2015-11-01 12:43:36

#pragma once

#include <windef.h>
#include <Gdiplus.h>


#define GDIPLUS_INITIALIZE
namespace
{
using namespace Gdiplus;
class CGdiplusStartup
{
private:
CGdiplusStartup(){
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup( &m_uPtrToken, &gdiplusStartupInput, NULL );
}
virtual ~CGdiplusStartup(){
GdiplusShutdown( m_uPtrToken );
}
private:
ULONG_PTR m_uPtrToken;
public:
static VOID InitializeGdiplush(){
static CGdiplusStartup gdiplushStartup;
}
};
struct __GdiplusInitialize{
__GdiplusInitialize()
{ CGdiplusStartup::InitializeGdiplush(); }
};
__declspec(selectany) __GdiplusInitialize gdiplusInitialize;
}



这是GdiplusInitialize.h中的所有代码,意图很明显,我定义一个CGdiplusStartup类的全局变量,通过CGdiplusStartup类的构造函数来调用GDI+的GdiplusStartup函数达到初始化GDI+的目的,但Release编译时定义的全局变量gdiplusInitialize被优化没了。CGdiplusStartup类的构造函数中调用的OutputDebugString也没打印任何东西,调用GDI+的函数时错误描述是:“GDI+未初始化”;我想禁止编译器优化这段代码,或者说,在Release时保留gdiplusInitialize的定义该怎么做?
...全文
787 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunflover454 2015-12-24
  • 打赏
  • 举报
回复
放到.cpp中,如下: #include "StdAfx.h" #include "MakePNG.h" CMakePNG::CMakePNG(void) { GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL); }
schlafenhamster 2015-12-24
  • 打赏
  • 举报
回复
class CMyImageApp : public CWinApp { ULONG_PTR m_gdiplusToken; ...... BOOL CMyImageApp::InitInstance() { // 加载 GdiPlus GdiplusStartupInput gdiplusStartupInput; GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL); ..... 哪里 不 靠谱 ?
schlafenhamster 2015-12-24
  • 打赏
  • 举报
回复
还有 int CMyImageApp::ExitInstance() { // TODO: Add your specialized code here and/or call the base class if (m_gdiplusToken) GdiplusShutdown(m_gdiplusToken); ......
  • 打赏
  • 举报
回复
我经常这么干, 编译器不会优化"掉"的, 不过就是函数调用么, 会内联优化的. 不过这太麻烦了吧, 还在头文件, 各种class, static还用上了编译器扩展. 我经常手动载入dll, 差不多这样:
  • 打赏
  • 举报
回复
引用 1 楼 dustpg 的回复:
我经常这么干, 编译器不会优化"掉"的, 不过就是函数调用么, 会内联优化的. 不过这太麻烦了吧, 还在头文件, 各种class, static还用上了编译器扩展. 我经常手动载入dll, 差不多这样:
    class Loader {
    public:
        Loader() {  };
        ~Loader() { ::FreeLibrary(m_hDllMsftedit);  }
    private:
        // Msftedit
        HMODULE     m_hDllMsftedit = ::LoadLibraryW(L"Msftedit.dll");
    } instance;
随便放在某个源文件就好了.
引用 4 楼 schlafenhamster 的回复:
// GdiPlus init before Create ! ULONG_PTR gdiplusToken; GdiplusStartupInput gdiplusInput; GdiplusStartup(&gdiplusToken,&gdiplusInput,NULL);
引用 3 楼 schlafenhamster 的回复:
// GdiPlus init before Create ! ULONG_PTR gdiplusToken; GdiplusStartupInput gdiplusInput; GdiplusStartup(&gdiplusToken,&gdiplusInput,NULL);
引用 2 楼 schlafenhamster 的回复:
// GdiPlus init before Create ! ULONG_PTR gdiplusToken; GdiplusStartupInput gdiplusInput; GdiplusStartup(&gdiplusToken,&gdiplusInput,NULL);
你们能否给点靠谱的回复?我结贴都不好结。
Minikinfish 2015-12-24
  • 打赏
  • 举报
回复
全局变量为啥定义在.h文件中呢?你不怕重复连接错误呀 应该定义在cpp文件中
Saleayas 2015-12-24
  • 打赏
  • 举报
回复
如果没有被任何 .cpp 文件引用,那么这个就好像没有定义过一样。 否者那些没有被引用的库的头文件岂不是很糟糕。 必须强制没有 .cpp 引用,因为编译器编译的就是 .cpp 文件。头文件是包含的。 如果你的 .cpp 文件同没有任何符号被引用,不管是直接的,还是间接的。 那么这个 .cpp 中的任何内容也不会被连接的。 如果你加入到这样的 .cpp 中,此时需要强制连接。
schlafenhamster 2015-11-02
  • 打赏
  • 举报
回复
// GdiPlus init before Create ! ULONG_PTR gdiplusToken; GdiplusStartupInput gdiplusInput; GdiplusStartup(&gdiplusToken,&gdiplusInput,NULL);
schlafenhamster 2015-11-02
  • 打赏
  • 举报
回复
// GdiPlus init before Create ! ULONG_PTR gdiplusToken; GdiplusStartupInput gdiplusInput; GdiplusStartup(&gdiplusToken,&gdiplusInput,NULL);
schlafenhamster 2015-11-02
  • 打赏
  • 举报
回复
// GdiPlus init before Create ! ULONG_PTR gdiplusToken; GdiplusStartupInput gdiplusInput; GdiplusStartup(&gdiplusToken,&gdiplusInput,NULL);
dustpg 2015-11-01
  • 打赏
  • 举报
回复
我经常这么干, 编译器不会优化"掉"的, 不过就是函数调用么, 会内联优化的. 不过这太麻烦了吧, 还在头文件, 各种class, static还用上了编译器扩展. 我经常手动载入dll, 差不多这样:
    class Loader {
    public:
        Loader() {  };
        ~Loader() { ::FreeLibrary(m_hDllMsftedit);  }
    private:
        // Msftedit
        HMODULE     m_hDllMsftedit = ::LoadLibraryW(L"Msftedit.dll");
    } instance;
随便放在某个源文件就好了.

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧