C语言中定义两个同名变量能够编译通过
int a; int a = 10;
C++中不能编译通过
c++.cpp:5:5: 错误:‘int a’ 重定义 int a = 10; ^ c++.cpp:4:5: 附注:‘int a’ previously declared here int a; ^函数检测增强: 参数类型,返回值,函数调用参数个数
C语言中能够编译通过
//函数检测增强 int getRectS(w, h) { } void test01() { getRectS(10, 10, 10); }类型转换检测增强
void test02() { char * p = malloc(sizeof(64)); // malloc返回值是void * }
在C++中必须加上强转
// 类型转换检测增强 void test02() { char * p = (char *)malloc(sizeof(64)); // malloc返回值是void * }struct 增强
//struct 增强 struct Person { int m_Age; // int plusAge(); C语言中struct不能加函数,C++可以 }; void test04() { struct Person p; // C语言必须加上struct关键字 }bool增强
C语言中bool值需要include
//三目运算符增强 void test05() { int a = 10; int b = 20; cout << (a > b ? a : b) << endl; (a > b ? a : b) = 100; cout << b << endl; // 100 , c语言中返回的是值,c++中返回的是变量 //c中可以这样写 *(a > b ? &a : &b) = 100; }const增强
c语言中const修饰的全局变量不可以修改,const修饰的局部变量可以用指针间接修改,是伪常量,不可以初始化数组,编译器是会分配内存的
//const增强 const int m_A = 100; //全局的不可以修改 void test07() { const int m_B = 20; int *p = &m_B; *p = 200; printf("*p = %d, m_B = %dn",*p, m_B); //200, 200 // int array[m_B]; 伪常量,不可以初始化数组 }
c++中const修饰的局部变量是真常量,可以初始化数组,*是在符号表里,不会分配内存,取地址时,编译器会临时开辟一块内存空间,p指向的是临时的空间
//const增强 const int m_A = 100; //全局的不可以修改 void test07() { const int m_B = 20; int *p = (int*)&m_B; *p = 200; cout << " *p = " << *p << " m_B = " << m_B << endl; // 200, 20 int array[m_B]; //真常量,可以初始化数组 }
c语言const默认是外部链接,别的文件可以直接使用
c++中cosnt默认是内部链接,要想在其他文件使用,在const前应加上extern提高作用域
分配内存时就可以间接修改(下面第二点除外,因为分配在全局data区)
- const修饰局部变量,不分配内存,在符号表里,取地址分配临时内存
- extern const int a;extern也会分配内存
- 用变量初始化const变量,会分配内存,可以指针间接修改
- 用自定义数据类型 也会分配内存
在c语言中,如果要定义一个常量,必须使用预处理器:
#define MAX 1024
首先,我们定义的MAX从未被编译器看到,因为在预处理阶段,所有的MAX就已经被替换为了1024,这使得定位问题出现困难。
解决办法就是用一个常量替换:
const int max = 1024;
const和#define区别总结:
- const有类型,可进行编译器类型安全检查,#define没有类型,不能进行安全检查
- const有作用域,而#define不重视作用域,如果需要定义在一段作用域内有效的常量,则#define不能使用。(#define默认定义处到文件结尾,也可以卸载宏常量)
#define MAX 1024 #undef MAX
宏常量没有命名空间
namespace DEF { #define A 97 } int main() { // cout << DEF::A << endl; 错误 cout << A << endl; // int A = 100; 命名冲突 return 0; }