#if !defined(AFX_MYAPI_H__4E0C0E71_454D_4E94_A513_1167F93265A2__INCLUDED_)
#define AFX_MYAPI_H__4E0C0E71_454D_4E94_A513_1167F93265A2__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <windows.h>
static int xxoo = MessageBox(0,"test","test",0);
#endif
这个头文件被很多CPP包含,程序执行时,MessageBox弹出来很多次,我想他只弹一次,但是不想用全局变量 互斥 之类的来判断是否执行过了。
我在想执行了这么多次,是这段代码是 想函数 一样,用的地方调用。还是像inline函数,被多次嵌到代码内,这样不是体积会大一些,我不想他这样。
这个程序不好调试,所以就来问了。

解决方案 »

  1.   

    这个头文件放到你项目的stdafx.h中试下
      

  2.   

    全局变量在程序运行之前初始化
    static标识的静态全局变量作用域是所在源文件,有多少个源文件包含了这个头文件,就有多少个该变量分布在这些模块内
    于是编译模块A——初始化静态全局变量——运行初始化语句跳出对话框——编译模块B——初始化静态全局变量——运行初始化语句跳出对话框——编译模块C……如果非要这么写,可以在一个源文件里定义非静态全局变量,其他源文件里声明该变量,这样只有一个全局变量,所以就只初始化一次,只跳出一个对话框
      

  3.   

    我建议的做法是,头文件里不要写任何执行代码,除了必须写在头文件里的内联和模板
    因为包含头文件本质上就是把头文件的代码复制到源文件中,头文件中的执行代码一样会被多处复制,导致链接时各模块内的变量名函数名冲突——即使在你眼中这些函数变量都是一样的,但“一样”并不是“同一个”
    楼主的代码里使用static标识变量,避免了变量名冲突,但多个变量这个本质并没有改变
      

  4.   

    __declspec(selectany) int xx = MessageBox(...);
      

  5.   

    头文件里扔可执行代码是大忌啊
    我们一贯执行,头文件里只能有变量定义、函数声明、或简单的datatype fun() const {return memeber;}
    这种代码。
      

  6.   

    俺一贯不建议使用static变量。