Chinaunix首页 | 论坛 | 博客
  • 博客访问: 20750
  • 博文数量: 8
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-10 21:24
文章分类
文章存档

2016年(1)

2015年(7)

我的朋友

分类: C/C++

2015-08-17 17:17:23

  在C++中练习了下宏的定义,有个关于delete的宏,释放指针,指针数组,结构体等,期间出现了一个错误,我定义了一个数组int p0[2] = {2, 3};然后调用宏函数释放数组,但是是不行的,数组名本身不能作为指针或者变量,它是一个地址常量,因此宏函数#define SAFE_DELETE_ARRAY(p) {if (p) {delete[] (p); (p) = NULL;}}中if (p)的调用显然就出错了;而普通函数调用时,数组名作为参数传入时,数组名会自动退化为指针,这点对于宏来说做不到,本身宏就是一个替换作为,所以再学习....

点击(此处)折叠或打开

  1. /*
  2.  * macro_cpp.cpp
  3.  *
  4.  * Created on: 2012-7-19
  5.  * Author: Administrator
  6.  */

  7. #include <iostream>
  8. #include <stdlib.h>
  9. #include <typeinfo>
  10. using namespace std;

  11. #define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
  12. #define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p)=NULL; } }
  13. #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }

  14. int *array = NULL;
  15. #define RAND_ARRAY2(n) do{ \
  16.         array = (int *)malloc(sizeof(int) * n); \
  17.         for (int i = 0; i < n; i++){ \
  18.             array[i] = i; \
  19.         } \
  20. }while(0);

  21. int main() {
  22.     int *sb = (int *) 2;
  23.     SAFE_DELETE(sb);
  24.     int p0[2] = {2, 4};
  25.     int* p1 = new int[2];
  26.     int (*p2)[4] = new int[2][4];
  27.     cout << p0[0] << endl;
  28.     //SAFE_DELETE_ARRAY(p0);//wrong 数组名是一个地址,一个符号地址常量,不是一个变量,更不是一个作为变量的指针!
  29.     SAFE_DELETE_ARRAY(p1);
  30.     SAFE_DELETE_ARRAY(p2);

  31.     int a[3] = { 1, 2, 3 };
  32.     cout << sizeof a / sizeof(typeid( a[0] ).name()) << endl; //typeid().name() return data_type

  33.     RAND_ARRAY2(4);
  34.     cout << "....." << array[0] <<"....." << array[1] << endl;

  35.     return 0;
  36. }

点击(此处)折叠或打开

  1. /*
  2.  ============================================================================
  3.  Name : macro.c
  4.  Author : hl
  5.  Version :
  6.  Copyright : Your copyright notice
  7.  Description : Macro in C, Ansi-style
  8.  ============================================================================
  9.  */

  10. #include <stdio.h>
  11. #include <stdlib.h>

  12. #define MAX(a, b) ((a > b) ? (a) : (b))
  13. #define IS_EVEN(n) ((n)%2 == 0)
  14. #define RAND_ARRAY(array, n) do{ \
  15.         array = (int *)malloc(sizeof(int) * n); \
  16.         int i;    \
  17.         for (i = 0; i < n; i++){ \
  18.             array[i] = i; \
  19.         } \
  20. }while(0);

  21. int main(void) {
  22.     printf("max(%d, %d) return max_number is %d\n", 7, 6, MAX(7, 6));
  23.     printf("number %d %s even\n", 4, IS_EVEN(4) ? ("is") : ("is not"));
  24.     //预定义宏
  25.     fprintf(stdout, "Line %d at %s, time is %s %s, %s standerd c\n", __LINE__, __FILE__, __DATE__, __TIME__, __STDC__ ? "is" : "is not");
  26.     //函数宏
  27.     int *array = NULL;
  28.     RAND_ARRAY(array, 4);
  29.     printf("array[%d] is %d\n", 3, array[3]);

  30.     return EXIT_SUCCESS;
  31. }

阅读(1008) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~