您的位置:首页 > 编程语言 > C语言/C++

C语言 goto void extern sizeof enum typedef分析

2016-07-25 17:29 253 查看
goto void extern sizeof 分析

遭人遗弃的goto
高手潜规则:禁用goto
项目经验:程序质量与goto的出现次数成反比
最后的判决:将goto打入冷宫
goto副作用分析

#include <stdio.h>

void func(int n)
{
int* p = NULL;

if( n < 0 )
{
goto STATUS;
}

p = malloc(sizeof(int) * n);

STATUS:
p[0] = n;
}

int main()
{
f(1);
f(-1);

return 0;
}
-------------------------------------------------------------------------------------------
void的意义

void修饰函数返回值和参数

--如果函数没有返回值,那么应该将其声明为void
--如果函数没有参数,应该声明其参数为void

void修饰函数返回值和参数仅为了表示无。

不存在void变量
--C语言没有定义void究竟是多大内存的别名。

没有void的标尺无法在内存中裁剪出void对应的变量。

void指针的意义
C语言规定只有相同类型的指针才可以相互赋值
void* 指针作为左值用于接收任意类型的指针
void* 指针作为右值赋值给其它指针时需要强制类型转换
int *pI = (int *)malloc(sizeof(int));
char *pC = (char *)malloc(sizeof(char));
void *p = NULL;
int *pni = NULL;
char *pnc = NULL;

p = pI; //ok
pni = p; //oops!

p = pC; //ok
pnc = p; //oops!

-------------------------------------------------------------------------------------------
extern中隐藏的意义
extern用于声明外部定义的变量和函数
extern用于告诉编译器用C方式编译

C++编译器和一些变种C编译器默认会按“自己”的方式编译函数和变量,
通过extern关键字可以命令编译器“以标准C方式进行编译”。
extern "C"
{
int f(int a,int b)
{
return a+b;
}
}
-------------------------------------------------------------------------------------------
为sizeof正名

sizeof是编译器的内置指示符,不是函数
sizeof用于计算相应实体所占的内存大小
sizeof的值在编译器就已经确定

我是sizeof,不是函数

-------------------------------------------------------------------------------------------
enum是一种自定义类型

真正的常量不等同于const 变量

enum默认常量在前一个值的基础上依次加1
enum类型的变量只能取定义时的离散值

第一个默认为0
enum Color
{
GREEN,
RED = 2,
BLUE
};
printf("%d\n",GREEN);
printf("%d\n",&GREEN);// error
真正意义上的常量不可取地址,常量没有分配空间,不可改变。

#define 宏常量只是简单的进行值替换,枚举常量是真正意义上的常量。
如图编辑器中的replace,简单字符串的替换。

#define宏常量无法被调试,枚举常量可以
#define宏常量无类型信息,枚举常量是一种特定类型的常量
-------------------------------------------------------------------------------------------
typedef分析

type rename

typedef用于给一个已经存在的数据类型重命名
typedef并没有产生新的类型
typedef重定义的类型不能进行unsigned和signed扩展

g++ test.c (c++) 对类型严格
gcc test.c

typedef和#define 区别

typedef是给已有类型取别名
#define为简单的字符串替换,无别名的概念

typedef char * PCHAR;
PCHAR p1,p2;

#define PCHAR char *
PCHAR p3,p4;
-------------------------------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言 goto void