理解LoadRunner中的局部变量和全局变量
在C语言中,变量有效性的范围称变量的作用域。不仅对于形参变量,C语言中所有的量都有自己的作用域,按作用域范围不同,可分为局部变量和全局变量两种变量类型。
在LoadRunner中应用全局变量和局部变量的示例脚本如下:
图4.9 LoadRunner 9.5 Web(HTTP/HTML)协议脚本代码截图
上面代码是在LoadRunner 9.5中编写完成,请参见图4.9左侧,其包含一个文件名称为“globals.h”,您可以在该头文件中定义全局变量,这里我们定义了一个全局整型变量,它的名称为“icount”,初始值为10,请参见globals.h头文件内容:
#ifndef _GLOBALS_H #define _GLOBALS_H //-------------------------------------------------------------------- // Include Files #include "lrun.h" #include "web_api.h" #include "lrw_custom_body.h" //-------------------------------------------------------------------- // Global Variables int icount=10;//全局变量 #endif // _GLOBALS_H |
Action部分代码如下:
int a=8,b=15; /*a,b为全局变量*/ int max(int a,int b) /*a,b为局部变量*/ { return a>b?a:b ; } int incb() { ++b; lr_output_message("incb()函数中的a=%d,b=%d",a,b); } Action() { int a=10;//局部变量 lr_output_message("a=%d,b=%d",a,b); incb(); lr_output_message("a=%d,b=%d",a,b); lr_output_message("max(%d,%d)=%d",a,b,max(a,b)); lr_output_message("globals.h中的全局变量icount=%d", icount); return 0; } |
在Action部分,起始声明了两个整型全局变量,a并赋予初值8,b赋予初值15。接下来,声明了两个整型数比较函数max(),在max()函数中,有两个整型参数,a和b。incb()函数,实现了对全局变量加一,而后,输出全局变量a和b。Action()中,先声明了局部变量a,并赋初值为10,接下来,输出局部变量a和全局变量b,又通过调用incb()函数对全局变量b进行加一,同事输出a和b。这里先给大家提一个问题,就是此时a的值应该输出的是全局变量a还是局部变量a的值?请读者朋友们认真考虑一下。后续还输出max(a,b),这里同样存在上面的问题,最后输出“globals.h”文件中的全局变量icount的值。
上面的脚本执行结果如下:
Running Vuser... Starting iteration 1. Starting action Action. Action.c(17): a=10,b=15 Action.c(11): incb()函数中的a=8,b=16 Action.c(19): a=10,b=16 Action.c(20): max(10,16)=16 Action.c(21): globals.h中的全局变量icount=10 Ending action Action. Ending iteration 1. Ending Vuser... |
根据执行结果,我们可以得出如下结论:
1. 全局变量是在函数外部定义的变量,它不属于哪一个函数,它属于一个源程序文件,其作用域是整个源程序。局部变量是在函数内作定义说明的,其作用域仅限于函数内。
2. 当局部变量和全局变量同名时,在局部变量的作用范围内,全局变量不起作用,如在Action()函数部分,a的值为10,而非全局变量8,这就回答了我们前面提的问题。当然,如果在该部分没有声明同名局部变量,则输出的内容为全局变量的值,如:变量b和“globals.h”中的全局变量icount的值,则输出值,为全局变量的值。