C++基础知识点

一、 基础架构及定义

  1. #include<...>定义要包含的头文件和类库
  2. #define 常量名 常量值 定义常量
  3. using namespace std;
  4. ifstream fin("流输入文件名"); 为文件定义流输入函数fin,函数名fin可自由定义,可为若干个不同的函数名定义各自的输入流。
  5. ofstream fout("流输出文件名"); 为文件定义流输出函数fout,函数名fout只是一个输出标识符,可自由定义多组标识符与输出流的对应关系。
  6. fin.close() 关闭fin的输入流文件(可省略)
  7. fout.close() 关闭fout对应的输出流文件(可省略)
  8. //注释内容⋯⋯ 单行注释
  9. 多行注释
    /* 多行注释开始标记
    ⋯⋯ 注释内容
    */ 多行注释结束标志
  10. 主函数
    MAIN(){...} 主函数无返回值
    int main(){... return 0;} 主函数有返回值

二、 #include可包含的库(头文件)

  1. iostream 标准输入输出流
  2. fstream 文件输入输出流
  3. cstdlib c++标准库
  4. cstdio c++输入输出模块
  5. CMATH c++数学函数库
  6. Cstring 字符串
  7. ctime 时间
  8. climits 极限库
  9. cfloat 实数库
  10. IOMANIP 流输出格式函数库
  11. algorithm 算法库
  12. vector 支持动态数组,是扩展栈容器 支持前缀比大小
  13. map建立两类数据的关联(映射)
  14. stack 基本栈结构支持s.pop(),s.push(x),s.size(),s.empty()及>,< s.top()
  15. queue 支持基本队列queue及优先队列priority_queue(堆)基本队列函数:q.pop() q.front() q.push(x) q.back() q.size()在queue中有前缀比较的>和<
  16. set 支持自平衡查找二叉树结构表示的单值集合set及多值集合multiset,其类函数支持集合的多种运算
  17. deque 扩展队列结构(循环队列容器) 支持前缀比大小
  18. list 双向链,用it++或it–在链中寻址也可用push或pop等操作支持前缀>、<比较
  19. bitset 位向量集合,可当数组使用,支持与或运算
  20. c语言头文件,如math.h、string.h、stdio.h等

三、 类型

  1. bool 布尔类型,1字节,非0(false)整数视为1(true)
  2. char 1字节,可视为有符号整数,其数组可作为字符串使用
  3. short int 2字节补码整数
  4. int 4字节补码整数
  5. long long (int) 8字节补码整数作常量赋值时应带后缀ll2——5的补码整数(有符号)前面加unsigned的前缀就是无符号类型的整数例如unsigned char变为无符号字符或整数
  6. float 4字节实数(单精度浮点编码)
  7. double 8字节双精度浮点编码
  8. long double 12字节长双精度浮点编码
  9. string 在CSTRING中可用+直接连接两个字符串、可直接赋值,也可用>、<、==等关系符号直接比较还可以向字符数组一样逐字符地访问,结束位置有0。string s的起始位置char* s.c_str()输入时空格默认为间隔符
    s.empty()是s为空的逻辑函数s的长度表示为
    s.length()在s中查找a的起始位置
    s.find(string a[,int b])可选项b表示查询起点,省略表示从头找,找不到该子串就返回“全1”的无符号整数
    s.substr(int b[,int l])表示s中从b开始到串尾(或长度为l)的子串
  10. FILE *f; 定义文件类型的指针f
  11. 无类型 void
  12. 自定义数据类型 typedef
    typedef char chuan[100];//定义长度不超100的串类型名chuan
    typedef int data[10];//定义名为data的数组类型
  13. 共用体或联合体
    union dt{int x;char y[3];};
    main() {
    dt a;
    cin>>a.y;
    cout<<a.x<<endl;
    ...}
  14. 结构体(或结点)类型的定义
    struct node {
    int data;
    node *next;
    node(){next=NULL;}};

    最后这行包含了构造函数,此函数在生成结构体变量时会自动触发,它可写可不写。与构造函数相反,析构函数~node(){…}在结构体被释放的时候自动执行。结构体内还可以定义处理该结构体变量的特定函数(例如a.make(x)等),也可以重载运算符。不特别限定时,其内部定义的对象都是public
  15. 类定义class
    与14相比,除了把struct换为class以外,其它很相似,只是不特别限定时,其内部定义的对象都是private
  16. 枚举类型enum
    enum fangxiang {up,down,left,right};
  17. 数据对pair,有序二元组
    pair<int,int>c;
    c.first=1,c.second=3;

    pair可作为map的key,建立平面坐标向其他数据的映射
    pair可比较,first和second分别为高、低关键字
    可用make_pair(x,y)生成此类数据
  18. 位压缩集合 bitset 需包含同名类库
    容器类型
  19. 集合与多集 set、multiset,需包含set库
    存储结构为红黑树(一种自平衡的查找二叉树),支持元素与集合、集合与集合的各种运算
    多集与集合的不同就是允许集合中出现值相等的元素,
    查找效率都是log2(n)
  20. 标准队列queue 需要同名类库
    queue<int>q;//可当成数组访问
    • 头端q.front()
    • 尾端q.back()
    • 队空q.empty()
    • 队长q.size()
    • x进队q.push(x)
    • 队头元素删除q.pop()
  21. vector(需包含同名函数库)多种定义形式
    • vector<类型>标识符 ;
    • vector<类型>标识符(最大容量);
    • vector< 类型 > 标识符(最大容量,初始所有值);//范围内每个变量填充相同初值
      -括号中用两个地址参数,用数组中的一段值作初始化
      int i[4] = {12,3,4,5};
      vector<类型>vi(i,i+2);
    • vector< vector<int> >v;二维动态容器
      定义此类型的迭代器(指针)
      vector<int>::iterator it;
      相关函数:
    • vi.size() vi的当前元素总数
    • a.capacity()则是当前分配给a的空间
    • vi.begin() vi的开始位置(引用类型)
    • vi.end() vi的结束位置 引用类型,戌指
    • 尾追加新元素x vi.push_back(x)
    • 在二维vi中追加一行 vi.push_back(line)
    • vi.capacity()可测得当前vi分配的空间
    • vi.clear() 清空
    • vi.insert(it,x) 在vi的it位置插入x或vi.insert(it1,it2,it3) 把it2到it3的数据插入到vi中的it1位置
    • vi.erase(it) 删除vi中it位置的元素此类型可排序、可反排,甚至可直接赋值例如vi=vj插入溢出重新分配加倍的空间并成片搬移数据
  22. 扩展队列 deque (需包含deque)
    与vector相近,但可灵活地对头尾进行push和pop操作。可利用sort reverse find count max_element min_element lower_bound upper_bound findif等函数进行处理。借助迭代器可进行任意位置上一或多个元素的插入和删除
  23. 双向队列 list,需包含同名库
    用迭代器作++和–的操作可访问后一元素或前一元素
  24. 优先队列(堆) priority_queue,(需包含 queue)
    • priority_queue<int>p; 定义大者优先的堆p
    • priority_queue<int,vector<int>,greater<int> >p;p>p; 定义小者优先的堆p
    • 堆头p.top()为最小或最大
    • 支持p.push(x)p.pop()的操作,代价都是log2(n)
  25. 关联容器map,需包含同名函数库
    查询代价log2(n),可查找、插入、删除、改写、排序
    • map<key,value>标识符;
      例如 map<string,int>m;
    • m.empty() 是否为空
    • m.size() 当前元素总数
    • m.begin() 首元素位置(引用类型)
    • m.end() 末位置
    • m.insert(map<string,int>::value_type("Two",2));向m中插入(“two”,2)的映射,可用m[“two”]=2实现
    • map<string,int>::iterator it=m.find(2); 在m中找下标是2的位置,没找到则值为m.end()
    • 此处的it是序号引用,不能做+2或-1等计算
    • it->first it->second分别表示下标和值
    • m.count(key) 是否存在下标是key的映射
    • m.erase(it) 删除一个位置的映射
    • m.erase(it,ti) 删除多个关联

四、 语句

  1. cin>>… 数据流输入变量(可当有返回值的函数用)
  2. cout<<.. (可带set函数15、16、17)
  3. fin>>… 有逻辑返回值TRUE或FALSE
  4. fout<<…
  5. 变量=表达式 赋值
    特殊情况有简略形式 x+=表达式 ++x x++
    可连续赋值,例如 变量=变量=⋯⋯=表达式;
    也可在引用前顺带赋值,例如a[i=x+1]=b
    不能对普通字符串变量赋值
    结合指针的赋值语句用法:
    • FILE *f;f=fopen("文件名","r"); 打开文件准备读
    • FILE *f;f=fopen("文件名","w");准备写
    • FILE *f=fopen("文件名","a"); 准备追加
    • node *p;p=new node;
  6. for(语句组...;条件...;语句组...)循环体;
  7. if(条件){...} else {...}
  8. if(条件){...}
  9. while(条件) 循环体
  10. do 循环体 while (条件);
  11. SYSTEM("PAUSE");停屏幕,
    在c语言中用getch() 后者不能用于C++语言中,需用stdio.h支持
    char c=getchar() 从键盘读一个字符
  12. return 表达式
    对于无返回值的函数,执行到该函数最后的}时或执行到无返回值的return时都会结束。
  13. break 从当前正在执行的多重分支或当前正在执行的循环体中退出
  14. 多重分支
    switch(表达式)
    {
    case ...:... break;
    case ...:... break;
    ...
    default:...}
  15. swap(a,b) 交换A B的值
  16. srand(time(0)) srand(随机种子) 随机化语句
  17. printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。
    • 调用格式为: printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容:
      • 一部分是正常字符, 这些字符将按原样输出;
      • 另一部分是格式化规定字符, 以”%”开始, 后跟一个或几个规定字符,用来确定输出内容格式。
    • 参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多,各参数之间用”,”分开, 且顺序一一对应, 否则将会出现意想不到的错误。
    • printf的格式控制的完整格式:
      • % - 0 m.n l或h 格式字符
      • 下面对组成格式说明的各项加以说明:
      • %:表示格式说明的起始符号,不可缺少。
      • -:有-表示左对齐输出,如省略表示右对齐输出。
      • 0:有0表示指定空位填0,如省略表示指定空位不填。
      • m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。n指精度,用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。
      • l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。
      • f格式:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:
      • %f:不指定宽度,整数部分全部输出并输出6位小数。
      • %m.nf :输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。
      • %-m.nf:输出共占n列,其中有n位小数,如数值宽度小于m右端补空格。
    • e格式:以指数形式输出实数。可用以下形式:
      • %e:数字部分(又称尾数)输出6位小数,指数部分占5位或4位。
      • %m.ne%-m.ne:m、n和”-”字符含义与前相同。此处n指数据的数字部分的小数位数,m表示整个输出数据所占的宽度。
    • g格式:自动选f格式或e格式中较短的一种输出,且不输出无意义的零。
格式小结:
  • 最常用的格式是%d,含义是以10进制形式打印一个整数。
    如果输出的整数是负数,则输出的第一个字符就是-号。
    %d:按整型数据的实际长度输出。
    %md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。
    %ld:输出长整型数据。
  • %u格式与%d格式类似,只不过要求打印无符号10进制整数。
    以无符号十进制形式输出整数。
    对长整型可以用”%lu”格式输出。同样也可以指定字段宽度用%mu格式输出。
  • %o格式请求输出8进制整数,以无符号八进制形式输出整数。
    对长整型可以用%lo格式输出。同样也可以指定字段宽度用%mo格式输出。
  • %x%X格式请求输出16进制整数。
    • %x格式中用小写字母a,b,c,d,e,f来表示10到15之间的数,以无符号十六进制形式输出整数。
    • 对长整型可以用%lx格式输出。同样也可以指定字段宽度用%mx格式输出。
    • %X格式中用大写字母A,B,C,D,E,F来表示10到15之间的数
      共同点:8进制和16进制整数总是作为无符号数处理的。
  • %s格式用于打印字符串,与之对应的参数应该是一个字符指针,待输出的字符始于该指针所指向的地址,直到出现一个空字符'\0'才终止。
  • %s:例如:printf(“%s”, “CHINA”)输出”CHINA”字符串(不包括双引号)。
  • %ms:输出的字符串占m列,如字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。
  • %-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。
  • %m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。
  • %-m.ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则自动取n值,即保证n个字符正常输出。
  • %c格式用于打印单个字符:例如:
    printf("%c",c); 等价于 putchar(c);
  • %g,%f%e这三个格式用于打印浮点值。
    %g格式用于打印那些不需要按列对齐的浮点数特别有用。其作用有二:
    • 去掉该数尾多余的零(没有达到六位的数)
    • 保留六位有效数字(多余六位的)
  • %e格式用于打印浮点数时,一律显示地使用指数形式:例如:输出圆周率时是:3.141593e+00
    两者的区别:
    • %g格式打印出的数是总共6位有效数字
    • %e格式打印出小数点后的6位有效数字
    • %f禁止使用指数形式来表示浮点数。因此圆周率输出为:3.141593
(但注意它的精度要求:也是小数点后6位有效数字)
  • %%格式用于打印一个%字符。
  • %E%G只是在输出时用大写字母(E)代替了小写字母(e)
  • 可以在”%”和字母之间插进数字表示最大场宽。
    例如: %2d 表示输出3位整型数, 不够2位右对齐。
    例如: %5d 表示输出3位整型数, 不够5位右对齐。
    例如: %10d 表示输出3位整型数, 不够10位右对齐。
unsigned int i=295;
printf("%2d\n",i);
printf("%5d\n",i);
printf("%10d\n",i);
295
  295
       295
Press any key to continue
  • 补0或者其它
    例如: %02d 表示输出3位整型数, 不够2位右对齐,补0。
    例如: %05d 表示输出3位整型数, 不够5位右对齐,补0。
    例如: %010d 表示输出3位整型数, 不够10位右对齐,补0。
    unsigned int i=295;
    printf("%02d\n",i);
    printf("%05d\n",i);
    printf("%010d\n",i);
    295
    00295
    0000000295
    Press any key to continue
  • 负数
    int i=-295;
    printf("%02d\n",i);
    printf("%05d\n",i);
    printf("%010d\n",i);
    -295
    -0295
    -000000295
    Press any key to continue
  • 可以控制输出左对齐或右对齐, 即在”%”和字母之间加入一个”-” 号可 说明输出为左对齐, 否则为右对齐。
    unsigned int i=295;
    printf("%-02d\n",i);
    printf("%-05d\n",i);
    printf("%-010d\n",i);
    295
    295
    295
    Press any key to continue
  • 可以在”%”和字母之间加小写字母l, 表示输出的是长型数。
    例如: %ld 表示输出long整数
    %lf 表示输出double浮点数
  • %9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6, 小数点占一位, 不够9位右对齐。
    例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除.
    实例
`unsigned int i=295;
printf("%d\n",i);
printf("%1d\n",i);
printf("%09d\n",i);
printf("%09d\n",(unsigned char)i);
printf("%9d\n",(unsigned char)i);
printf("%-9d\n",(unsigned char)i);
*/
295
295
000000295
000000039
       39
39
Press any key to continue

对于m.n的格式还可以用如下方法表示(例)
int m=10,n=5;
char ch[]="abcdefghijklmnopqrst";
printf("%*.*s\n",m,n,ch);//输出为 abcde

前边的*定义的是总的宽度,后边的定义的是输出的个数,分别对应外面的参数m和n。
我想这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式

"%08lx\n",4byte
"%04x\n",2byte
"%-2.2BX",1byte
printf("%d\n",x);

又例如
PRINTF("%.03f",12.3456) 输出12.346
printf("%4d",88)输出 88
printf("%04d",88) 输出0088
常用格式串
- %lld 8字节整形
- %lf:双精度实数
- %x 十六进制 0x00 表示十进制0
其它字符按字符串原样打印

  1. continue 结束当前这一次循环体的执行
  2. node *p;delete p; 将P结点释放,还给系统
    如果在定义NODE时也定义了反构造函数~NODE(),责此函数被触发。
  3. scanf("%d",&n) 将整型数据输入到n中,输入格式串决定输入数据的格式。
  4. fprintf(f,"%d",n) 向文件F的当前位置输出整数N
  5. fscanf(f,"%d %d",&n,&m)
    对于字符串数组&可有可无
    char a[10],b[10];
    fscanf(f,"%s %s",a,&b);
  6. memset(数组名,每字节取值,字节数) 用固定值(0~255)填充指定区域的内存。
  7. memcpy(*a,*b,c) 把*b开始的c个字节复制到*a开始的区域。
  8. gets(char* a) 让字符串a从键盘得到一个输入行,包括其中的空格
    fgets(s,l,f) 从文件f中读取长度不超l的输入行存入s,包括空格
  9. freopen("文件名","方式字符",标准输入或输出)
    可为标准输入输出重定向
    方式字符:r w a,或加’b’表示二进制方式例如wb rb
    标准输入用stdin表示,
    标准输出用stdout表示。
  10. cin.getline(char *s,l) 限制长度为l的行输入
    与cin的输入同源,但在cin之后使用时需要用一个
    cin.getline(s,0)
    把未结束的换行读完,否则容易出错
  11. rewind(FILE *f) 将文件f指针置为开始
  12. fseek(*f,p,m) 设置文件f的指针位置
    • 可用于r和w的方式,不能用于a方式
    • p为偏移量,可正可负
      m为偏移起点方式代码:0从头,1从当前位置,2从文件尾
  13. fwrite(*p,u,t,*F) 将位置p(无类型指针)开始单位长度u的t项数据写入文件F中
  14. fread(*p,u,t,*F) 从文件指针F处读出t项单位长度为u的数据到内存的p位置
    上述2语句能对有格式的数据进行输入和输出,文件都是二进制格式(b)
  15. strlwr(char *s) 将s中的大写字母转换为小写
  16. strupr(char *s) 将s中的小写字母转换为大写
  17. fclose(FILE *f) 关闭文件
  18. next_permutation(a,a+n); 把a数组中n个元素的全排列变换为下一个排列
    此语句需要算法库的支持
  19. make_heap(int *a,a+n);//从a[0]到a[n-1]整体建堆,o(n)代价
  20. push_heap(b,b+i+1);//把b[i]插入从b[0]到b[i-1]的堆中
  21. pop_heap(b,b+i);//利用pop将堆顶删除至堆尾b[i-1]
  22. reverse(首地址,末地址) 反排数组,参数可以是指针或线性结构容器的迭代器
  23. 以下三个函数需流输出模块的支持
    • SETW(X) 指定流输出的场宽
    • SETFILL('C') 把场宽的空余位置填充上指定字符
    • SETPRECISION(小树位数) (小树位数包括小数点的位置,参数的小树位数不够时不填充无效0)
  24. exit 0; 在子函数中结束整个程序
  25. sort(首地址,末地址) 数组升序排序,参数为指针或迭代器
    可添加函数指针cmp作为第三参数,解决降序或其他特殊排序要求
    bool cmp(const int &a,const int &b) {
    return a>b;
    }//整数降序排序
    bool cmp(const node &a,const node &b) {
    return a.x+a.y<b.x+b.y;
    }//按两个分量之和升序排序

    在C语言中还有一种较早期的用法:
    qsort(首地址,数据个数,单位数据字节数,比较函数名)
    比较函数是自定义的,例如
    int cmp(const void *a, const void *b)
    {
    return ((const Sample *)a)->data - ((const Sample *)b)->data;
    }

五 函数

  1. abs()
  2. pow(底数,指数) 底数为实型,结果也是实型
  3. strlen(s)
  4. strcat(s1,s2) 将S2接到S1后面并返回S1的地址
  5. strcmp(s1,s2) 返回值 1 0 -1
  6. strcpy(s1,s2) 可字符串赋值
  7. strncpy(s1,s2,n) 将S2的前N个字符复制到S1。如果超长则\0后面的字符将不被复制
  8. strstr(s1,s2)
  9. itoa(n,s,10) 将n化为10禁制后转化为数字串存入s中
  10. atoi(s)数字串转数,转换失败前的转换有效
  11. atof(char *s)实数串转实数
  12. rand() 产生0到32767之间的随机整数
  13. 类型标识符(数据) 将参数强制转换为指定类型的数据形式
    也可用: (类型)数据 来代替
  14. (条件?值1:值2) 条件函数
  15. max(x,y) 两个值中的较大值
  16. min(x,y) 两个值中的较小值
  17. CLOCK() 时钟函数值
    每秒增加CLOCKS_PER_SEC,其值常为1000,
    有iostream的定义即可
  18. log底数(真数) 省略底数时默认为自然对数
  19. time(0) 时间计数器,每秒加1,一年增加超过30000000
  20. sqrt(x) 返回算数平方根
  21. sizeof(变量或类型) 返回该变量或类型的字节数
  22. fgetc(FILE *f) 返回文件当前指针处读取的字符,指针顺移
    例如
    while((c=fgetc(f))!=EOF) c-=('a'-'A')*(c>'Z');
    此句把c中的字母变大写
  23. ftell(FILE *f) 返回文件当前指针位置
  24. &可返回变量首地址,例如
    例如 &x,&a[i][0]
  25. make_pair(x,y) 返回由x和y生成的数对
  26. 查找元素x find(首地址,末地址,x)
    返回值是指针或迭代器,若能找到就返回该位置,否则返回末地址(虚地址
  27. 数据计数 count(首地址,末地址,x) 统计x的个数
    此函数用于map类型时,找的是key(first)是否存在

六 运算

  1. 数值运算 +、-、*、/、%
    +-*/有整数加减乘除法和十数加减乘除法两类含义,系统自动辨别,而%只用于整型。
    *在定义变量时是地址(指针)的说明符号,与定义好的指针类型变量连用时表示该地址的内存单元
  2. 关系运算 ==、>、<、>=、<=、!=
  3. 逻辑运算
    !、&&、||
  4. 位运算
    & | ^ ~、>>、<<
    其中的&与单个变量作一元运算时是取地址运算
  5. 运算符重载
    struct Sample { int data; };
    bool operator == (const Sample &a, const Sample &b) {
    return a.data == b.data;
    }
    inline bool operator != (const Sample &a, const Sample &b) {
    return !(a == b);
    }

七 运算顺序

() [] -> .
后置++ –
前置++ – ! ~ 正负号+ - 地址* & (类型) sizeof
* / %
+ -
位移<< >>
< <= >= >
== !=
&
^ 异或
|
&&
||
?: 条件赋值
= 赋值
,

六 系统常量

  1. CLOCKS_PER_SEC
    clock()每秒增加的数量,其值常为1000
  2. NULL 空地址 0
  3. false 逻辑假 0
  4. true 逻辑真 1
  5. INT_MAX最大整形
  6. INT_MIN 最小整形
  7. UINT_MAX 最大无符号整形
  8. LLONG_MAX 最大无符号整形
  9. ULLONG_MAX 最大无符号长整形
  10. DBL_MAX 最大双精度实数,需要cfloat
  11. EOF 文件结束
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.如何设置全局变量?                            在 .h文件里定义变量,然后在process的HEAD BLOCK 里include这个头文件,就可以使用全局变量了。   2.OPNET中如何更方便的看程序? 1.opnet中的设置:   preferences->editor_prog        2.source insight的设置  :operation->preferences->symbol Lookups->Project symbol path->Add Project to   Path  (添加自己创建一个包含所有opnet model 和 include目录的project)  当然,这个有些不足,就是那个sv,tv,hb等中定义的内容,不能进行关联。     3.OPNET中的函数FIN,FRET以及FOUT都是什么功能?    为了使一个用户定义的函数被执行,该函数必须与一个特殊的堆栈跟踪代码相连。堆栈跟踪技术靠在函数的入口点和出口点插入预处理器宏指令完成(一个函数只有一个入口点,但可以有多个出口点(由C语言的return声明决定))。这些宏指令为:FIN、FOUT和FRET。FIN被插入到函数的入口点,FOUT被插入到函数的出口点,但却不返回任何值,FRET被插入到函数的出口点,返回一个值。注意这些宏指令不需要以分号结束(它们自我包含),FIN的参数中也不需要双引号。    Opnet提供的所有的示例模型都包含了这些宏指令,并且建议用户定义的函数也包含这些宏指令。如果FIN、FOUT、和FRET被正确插入了用户代码中,我们就可以使用op_vuerr来找出程序错误的位置,哪怕是在一个嵌套的模型函数调用中。  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值