全局变量初始化为函数返回值(先于main函数)

  以前在提供给客户的接口库中如果是dll,则dll中的互斥锁很容易在dllmain中初始化,

但是对于lib静态库则没有想到更好的处理办法。现在才发现原来可以在lib中也可以简单直

接的在main函数外初始化。大家有这方面更深一步的研究,希望能共享一下,多谢!

1、vs2010下,编译为可执行程序(注意运行顺序):

2、编译为静态库被调用(注意运行顺序):

3、编译为动态库被调用(注意运行顺序):

相关现象1:直接在项目-》属性-》链接器-》高级-》入口点中定义为main,程序编译过程中警告,

运行后,add函数并没有先于main函数执行

入口点改为add,仍然会有警告:

运行后a+b值为随机

由此可以看出  此时vs入口点“并不是”或者“并不能说”是 main 或者add。

使用OD更进一步的跟踪:在1情况下,在_tmaincrtstartup函数中会在进行堆变量初始化时直接调用add函数,在调用add函数后才会再进行main函数调用。

后续猜想:如果用来修改PE文件,是否这样更容易截取程序执行流程?

欢迎交流。

时间: 2024-10-12 13:02:17

全局变量初始化为函数返回值(先于main函数)的相关文章

Shell函数返回值、删除函数、在终端调用函数

Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: function_name () { list of commands [ return value ] } 如果你愿意,也可以在函数名前加上关键字 function: function function_name () { list of commands [ return value ] } 函数返回值,可以显式增加return语句:如果不加,会将最后一条命令运行结果作为返回值. Shell 函数返

Shell函数:Shell函数返回值、删除函数、在终端调用函数

函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: function_name () { list of commands [ return value ] } 如果你愿意,也可以在函数名前加上关键字 function: function function_name () { list of commands [ return value ] } 函数

【Shell脚本学习22】Shell 函数:Shell函数返回值、删除函数、在终端调用函数

函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: function_name () { list of commands [ return value ] } 如果你愿意,也可以在函数名前加上关键字 function: function function_name () { list of commands [ return value ] } 函数

指针专题4-指针作为函数返回值(指针函数)

C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数.下面的例子定义了一个函数strlong(),用来返回两个字符串中较长的一个. /* 返回两个字符串中最长的一个 */ char *strlong(char *str1, char *str2) { if(strlen(str1)>=strlen(str2)){ return str1; }else{ return str2; } } void main(){ char str1[30],str2[30],*str; gets

C++ Primer 学习笔记_17_从C到C++(3)--引用、const引用、引用传递、引用作为函数返回值、引用与指针区别

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 一.引用 1.引用是给一个变量起别名 变量: 名称 空间 引用: 引用不是变量 引用仅仅是变量的别名 引用没有自己独立的空间 引用要与它所引用的变量共享空间 对引用所做的改变实际上是对它所引用的变量的改变 引用在定义的时候必须要进行初始化 引用一经初始化,不能重新指向其他变量 2.定义引用的一般格式: (1)类型  &引用名 = 变量名: (2)例如: int a=1; int &b=a; // b是a的别名,因此a和b是同一个单元 (3)

C语言中函数返回值的问题

c语言中有关于在函数返回值的问题,在函数中的局部变量主要是在栈上开辟的,出了函数变量就被回收了,针对函数返回值得问题,给出下面几个比较具体的例子来说明: 函数返回值是在函数中定义的局部变量 这类型的返回值在主函数中是可以使用的,因为返回局部变量值得时候,返回的是值得一个副本,而在主函数中我们需要的也只是这个值而已,因此是可以的,例如 int fun(char *arr) { int num = 0; while (*arr != '\\0') { num = num * 10 + *arr -

类引用作为函数返回值的问题

记录自己尝试C++的一点心得 我的第一个尝试其实是如下, class Object{ public: static int r(){ int i=1; return i; } }; int main(int argc, char const *argv[]) { int& i=Object::r(); return 0; } 报错信息 main.cpp:40:19: error: invalid initialization of non-const reference of type 'int

函数返回值类型为枚举类型

枚举是个好东西,它和结构体一样,都可以定义一种数据类型,但是枚举有一个更优点,就是它可以默认指定定义的初始值. 有一个项目,涉及到CPU卡,卡片有错误.上电.DF01目录等状态,如果单独定义这些变量,要使用很多变量,这里有一个规律,即:CPU卡不能同时为这几种状态中的几个,只能为其中的一个,这样,我们可以定义一个枚举类型变量,例如: //标识ic的几种状态typedef enum{     ICC_ERROR,       ICC_NO_EXIST,       ICC_EXIST,      

转: 引用作为函数返回值

转自:http://blog.csdn.net/vivi_wang_11/article/details/7437382 函数返回值时,要生成一个值的副本.而用引用返回值时,不生成值的副本. 例如,下面的程序是有关引用返回的4种形式: //********************* //** ch9_6.cpp ** //********************* #include <iostream.h> float temp; float fn1(float r) { temp = r*r