// test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <crtdbg.h>
extern "C" int foo(int n);
int main(int argc, char* argv[])
{
int i = 0;
for (i = 10; i < 13; i++)
{
foo(i);
}
getchar();
return 0;
}
extern "C" int foo(int n)
{
static s_iTest = n;
/** 普通的静态变量用法
/// 不管对静态局部变量赋值几次, 都执行一次
s_iTest = 10
s_iTest = 10
s_iTest = 10
*/
/**
在s_iTest初次赋值前, 在内存窗口可以看到s_iTest的地址上内容和其后的一个字节内容为
00698C3C 00 00 00 00 00 00 00 00 00
在s_iTest初次赋值后, 在内存窗口可以看到s_iTest的地址上内容和其后的一个字节内容为
00698C3C 0A 00 00 00 01 00 00 00 00
说明s_iTest后有一个字节变化了, 该字节为标记前面的静态局部是否已经初始化过了
那我们就控制这个标记,永远都设置为前面的静态局部变量未初始化, 就可以让静态变量多次初始化
*/
(&s_iTest)[1] = 0;
/** run result
s_iTest = 10
s_iTest = 11
s_iTest = 12
*/
printf("s_iTest = %d\n", s_iTest);
return 0;
}
<2016_0119>
又想出了一个测试效果.
/// @file exam_static_value_setter_and_init
/// @biref 静态变量初始化值的控制
#include <stdlib.h>
#include <stdio.h>
void fnTestStaticValueNormal(int iIn, bool bStaticValueInit) {
static int s_iCnt = iIn;
if (bStaticValueInit) {
/// 如果初始化了静态变量
/// 等下一次执行本函数时, 会重新执行 s_iCnt = iIn
/// 因为局部静态变量在函数内, 所以只有静态全局变量才有这个奇技淫巧
/// 全局静态变量,改了初始化标记,也没有什么用处.
/// 我们无法让全局静态变量再次初始化, 只能是对全局静态变量赋值.
((int*)&s_iCnt)[1] = 0;
}
printf("(s_iCnt(%d) + iIn(%d)) = %d\n", s_iCnt, iIn, s_iCnt + iIn);
}
int main(int argc, char* argv[]) {
int i = 0;
for (i = 0; i < 6; i++)
fnTestStaticValueNormal(i, false);
printf("\n");
for (i = 0; i < 6; i++)
fnTestStaticValueNormal(i, true);
/** run results
(s_iCnt(0) + iIn(0)) = 0
(s_iCnt(0) + iIn(1)) = 1
(s_iCnt(0) + iIn(2)) = 2
(s_iCnt(0) + iIn(3)) = 3
(s_iCnt(0) + iIn(4)) = 4
(s_iCnt(0) + iIn(5)) = 5
(s_iCnt(0) + iIn(0)) = 0
(s_iCnt(1) + iIn(1)) = 2
(s_iCnt(2) + iIn(2)) = 4
(s_iCnt(3) + iIn(3)) = 6
(s_iCnt(4) + iIn(4)) = 8
(s_iCnt(5) + iIn(5)) = 10
*/
return 0;
}