博客昵称:博客小梦
最喜欢的座右铭:全神贯注的上吧!!!
作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!
博主小留言:哈喽!各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!
哈喽各位友友们,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!我仅已此文,分享C嘎嘎的基础知识知识~ 都是精华内容,可不要错过哟!!!
这里的权限,指的是引用带出来的。
这是不允许的。
这是可以的
这是可以的。
以下面代码为例分析:
int func()
{
int a = 0;
return a;
}
int main()
{
const int& ret = func();
const int a = 0;
// 权限的放大
// int& b = a;
//int b = a; 可以的,因为这里是赋值拷贝,b修改不影响a
// 权限的平移
const int& c = a;
// 权限的缩小
int x = 0;
const int& y = x;
int i = 0;
const double& d = i;
return 0;
}
一个程序的完整运行,必须经过这四个阶段:预处理 – 编译 – 汇编 – 预处理。
对于条件编译,相关资料给出的解释是:**条件编译功能:预处理程序提供了条件编译的功能。条件编译允许只编译源文件中满足条件的程序段,使生成的目标程序较短,从而减少了内存的开销,并提高程序的效率,**可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。另外,条件编译是为了让程序在各种不同的软硬件环境下都以运行。即,提高了程序的可移植性和灵活性。
在C语言中,若要对程序中的代码段有条件地进行编译,就要用到条件编译命令,条件编译主要有如下几种格式:
#if 表达式`` ``语句序列①``[#``else`` ``语句序列②]``#endif
功能:当表达式的值为真时,编译语句序列①,否则编译语句序列②。其中,#else和语句序列②可有可无。
#ifdef 标识符`` ``语句序列①``[#``else`` ``语句序列②]``#endif
功能:当标识符已被定义时(用#define定义),编译语句序列①,否则编译语句序列②。其中#else和语句序列②可有可无。
#ifndef 标识符`` ``语句序列①``[#``else`` ``语句序列②]``#endif
功能:该格式功能与ifdef相反。
在C语言中,是直接利用函数的函数名来形成符号表的。因此,当函数名相同时,系统在通过符号表来确定要调用函数的所在地址时,就会发生冲突,从而发生链接错误。
C++之父看到C语言的这个缺陷,便在C++上引入了函数名修饰规则。就是其是利用函数名和参数类型在符号表中作为自己的唯一标识。
返回值不同,不能构成函数重载。
如果函数名修饰规则带入返回值,也是不能构成函数重载的。因为,在调用的时候,不能指定返回值类型。
为什么C++ 支持函数重载而C语言不支持函数重载? 我的理解是:因为一个程序的完整执行过程是包括:预处理、编译、汇编、链接。而在链接的过程中,会将.o的文件合并在一起,并会去符号表里去查找对应的调用函数。函由于C++引入了数名修饰规则,根据函数名和参数类型区分函数以及同名函数。因此支持函数重载。而C语言是直接利用函数名来标识的,因此函数名相同时,链接的过程去寻找对应调用的函数时,就会发生冲突,从而产生链接错误。
其实是可以的,但是需要进行一些修改。只能对C++语言编译器进行extern,因为C++编译器是支持C的,而C编译器不支持C++。
简单的来说,就是告诉编译器,用C语言的规则。例如,下面是让C++编译器按照C语言的函数名修饰规则,在编译阶段形成符号表并执行相应的操作。
#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus
void StackInit(ST* ps);
void StackDestroy(ST* ps);
void StackPush(ST* ps, STDataType x);
void StackPop(ST* ps);
STDataType StackTop(ST* ps);
bool StackEmpty(ST* ps);
int StackSize(ST* ps);
#ifdef __cplusplus
}
#endif // __cplusplus
本篇文章旨在分享的是分享C嘎嘎的基础知识。希望大家通过阅读此文有所收获!
如果我写的有什么不好之处,请在文章下方给出你宝贵的意见。如果觉得我写的好的话请点个赞赞和关注哦~