1.
C++虽然主要是以C的基础发展起来的一门新语言,但她不是C的替代品,不是C的升级,C++和C是兄弟关系。没有谁比谁先进的说法,更重要的一点是C和
C++各自的标准委员会是独立的,最新的C++标准是C++98,最新的C标准是C99.因此也没有先学C再说C++的说法,也不再(注意这个"不再")
有C++语法是C语法的超集的说法。
2. C++/CLI 和 C# 是微软的,它们与C和C++没有任何关系,虽然部分语法相似。但哪两种语言不相似呢?都是abc这26个字母。
3.
不要使用TC/TC++/BC/CB等古老的编译器来学习C/C++,因为它们太古老了,不支持新的C/C++标准。不要使用CBX/VC++6.0
/VC2005等对C/C++标准支持不好的编译器,虽然这些编译器适合工作,但不适合学习,因为它们中的语法陷阱很多。记住唯一适合学习的编译器是
gcc/mingw.[antigloss注:Dev-C++ 使用的编译器就是gcc & g++]
4. 不要用""代替<>来包含系统头文件,虽然有些编译器允许你这样做,但它不符合C/C++标准。
错误的示例:#include "stdio.h",#include
"iostream".[antigloss注:习惯上,<> 用于包含标准头文件和系统头文件,""
用于包含自定义头文件。标准似乎没有明确规定不准用 "" 包含标准头文件和系统头文件。使用 ""
包含标准头文件或者系统头文件只能说是一种不良风格。]
5.
不要将main函数的返回类型定义为void,虽然有些编译器允许你这样做,但它不符合C/C++标准。不要将函数的int返回类型省略不写,在C++中
要求编译器至少给一个警告。错误的示例:void main() {},main() {}
[antigloss注:C99和C++98都要求编译器对省略int至少发出一个警告]如果不需要从命令行中获取参数,请用int
main(void) ;否则请用int main( int argc, char *argv[] ) .
6. 不要把VC++中的 #include "stdafx.h" 贴出来,它是预编译头文件。如同上菜时不要把厨师也放到托盘中。
7. [C++]不要#include <iostream.h>,不要#include
<string.h>,因为它们已经被C++标准明确的废弃了,请改为 #include <iostream> 和
#include <cstring>.规则就是:
a. 如果这个头文件是旧C++特有的,那么去掉。h后缀,并放入std名字空间,
比如 iostream.h 变为 iostream.
b. 如果这个头文件是C也有的,那么去掉。h后缀,增加一个c前缀,比如 string.h
变为 cstring;stdio.h 变为 cstdio, 等等。
BTW:不要把string、cstring、string.h三个头文件搞混淆
BTW:windows.h不是C/C++的标准文件,因此它的命名C/C++不管。
8. 不要再写 char* p = "XXX" 这种语句,要写成 const char* p =
"XXX",编译器之所以让前者通过编译是为了兼容以前的大量的旧代码。[antigloss 注:这段话对 C++ 而言是正确的。但是,目前的
C99 标准似乎并没有定义 "XXX" 一定是常量。]
BTW:const TYPE* p 和 TYPE const* p 是一样的,风格不同而已。
BTW:C语言中也有const关键字。
9. 不要在同一条语句中包含一个变量的多个++/——,因为它们的解析在C/C++标准中没有规定,完全取决于编译器的个人行为。
10. C/C++ 是平台无关性语言,因此系统相关的 process/GUI 等不在标准 C/C++ 库中。比如 graphics.h 和 windows.h 等是由某个编译器提供的,而不是由C/C++ 提供的。
11. C/C++只是语言,而且是平台无关性语言。论坛上有部分人甚至认为C就是dos,C++就是windows,那么请问linux是什么?
12.[C++]面向对象曾经是设计C with
class(C++的前身)的主要目的,但C++不是,C++是一个多典范语言。主要支持过程调用、基于对象、面向对象、泛式编程这四种编程典范。当然还
支持functional, generative,metaprogramming等典范。
13. 语法学家不是文学家,所以当你学会了一门计算机语言时,你还需要学习数据机构和算法,还需要掌握工具和平台API的用法。
14. C/C++ 是通用语言,因此语法很复杂,你应当裁减成适合你自己的语法集合,比如裁减成 better C 和 ADT.
15. C/C++是通用语言,因此只含通用的库,你应该丰富自己需要的库,比如汽车工业协会有自己的C/C++函数/类/模板库。
强制转换 malloc() 的返回值
首先要说的是,使用 malloc 函数,请包含 stdlib.h(C++ 中是 cstdlib),而不是 malloc.h .因为
malloc.h 从来没有在 C 或者 C++ 标准中出现过!因此并非所有编译器都有 malloc.h 这个头文件。但是所有的 C
编译器都应该有 stdlib.h 这个头文件。
在 C++ 中,强制转换 malloc() 的返回值是必须的,否则不能通过编译。但是在 C 中,这种强制转换却是多余的,并且不利于代码维护。
起初,C 没有 void 指针,那时 char* 被用来作为泛型指针(generic pointer),所以那时 malloc
的返回值是 char* .因此,那时必须强制转换 malloc 的返回值。后来,ANSI C(即C89) 标准定义了void
指针作为新的泛型指针。void 指针可以不经转换,直接赋值给任何类型的指针(函数指针除外)。从此,malloc 的返回值变成了 void*
,再也不需要强制转换 malloc 的返回值了。以下程序在 VC6 编译无误通过。
#include <stdlib.h>
int main( void )
{
double *p = malloc( sizeof *p ); /* 不推荐用 sizeof( double ) */
free(p);
return 0;
}
当然,强制转换malloc的返回值并没有错,但画蛇添足!例如,日后你有可能把double *p改成int *p.这时,你就要把所有相关的
(double *) malloc (sizeof(double))改成(int
*)malloc(sizeof(int))。如果改漏了,那么你的程序就存在 bug
.就算你有把握把所有相关的语句都改掉,但这种无聊乏味的工作你不会喜欢吧!不使用强制转换可以避免这样的问题,而且书写简便,何乐而不为呢?使用以下代
码,无论以后指针改成什么类型,都不用作任何修改。
double *p = malloc( sizeof *p );
类似地,使用 calloc ,realloc 等返回值为 void* 的函数时,也不需要强制转换返回值。
http://tech.ddvip.com/2009-05/1242201666118937_3.html
分享到:
相关推荐
总结起来,虽然C语言不具备C++那样的内置多态机制,但通过函数指针和结构体,我们可以实现类似的功能。这种方法需要更高的编程技巧和更严谨的设计,但在某些场合下,如嵌入式系统或性能要求极高的场景,可能是一种...
6. **总结和作业**:课程最后将进行总结并布置作业,以便巩固所学知识。 #### 六、总结 《麻省理工免费课程:C语言内存管理和C++面向对象编程》是一门非常有价值的课程,旨在帮助程序员深入理解C语言和C++的核心...
最后,资源包中的《C语言程序设计(第三版)-谭浩强[开始免费了].ppt》是一份教学幻灯片,它可能包含了C语言的主要知识点的总结和示例,便于学生快速回顾和理解。幻灯片的形式通常更加直观,适合课堂讲解或自学时配合...
总结起来,这个示例展示了如何在Linux环境下使用C语言调用C++函数,包括编写C++接口、C语言调用以及使用Makefile进行编译和链接。这种跨语言交互对于维护和扩展现有系统,以及利用C++的高级功能时非常有用。理解并...
C语言和C++作为两种广泛使用的编程语言,各自有着独特的特性和应用场景。本文旨在深入探讨这两种语言之间的主要区别,尤其是在编程思想上的差异。 #### 二、C语言概述 C语言是一种结构化的编程语言,由Dennis ...
"C语言C++全套资料(含练习项目)"这个资源包显然旨在帮助初学者全面掌握这两种语言。以下是对这些文件内容的详细解读: 1. **C++选课系统.cpp**:这是一个实际的应用程序,可能包含用户注册、选课、查询课程等功能...
【深信服笔试题目(C语言和C++)】是一份针对毕业生的笔试资源,主要涵盖了C语言和C++的基础及进阶知识点。深信服作为一家知名的IT企业,其笔试通常会考察应聘者的编程基础、逻辑思维以及问题解决能力。这份资料对于...
总结一下,C语言和C++的头文件是连接程序和库的关键桥梁,它们定义了函数、变量、类型和其他编程元素。理解如何正确地使用和管理头文件是成为熟练的C/C++程序员的基础,也是通过相关认证考试的关键。希望这份资料对...
- "C语言知识点总结【完美版】.doc":这可能是对C语言核心概念的全面梳理,包括语法、常用函数、技巧和注意事项。 - "C语言.docx":可能是C语言的另一个详细教程,可能涵盖了一些特定主题或实例。 - "C语言公共基础...
### C和C++内存区域划分详解 在C和C++编程中,理解内存的划分对于高效编程至关重要。本文将深入探讨C和C++中的内存区域划分,包括它们各自的功能、用途以及相互之间的区别。 #### 一、C语言中的内存区域划分 在...
在IT行业中,C语言、C++以及嵌入式编程是至关重要的领域,这些技术广泛应用于系统开发、软件工程以及硬件交互。以下是对标题、描述和标签中涉及知识点的详细阐述: 1. **C语言面试总结**: C语言是基础且强大的...
在实际编程中,理解和运用`#ifdef __cplusplus`和`extern "C"`对于实现C与C++代码的互操作性非常重要。通过适当地使用这些特性,可以确保代码能够在不同的编译环境下正确编译和链接,从而充分利用现有的C/C++资源。
C/C++问题总结 1. 关键字 1.1 const 1.1.1 常量 1.1.2 修饰指针 1.1.3 修饰函数参数与返回值 1.1.4 类中的应用 1.2 static 1.3 volatile 1.4 extern 2. 函数 2.1 sizeof与strlen区别 2.2 strcpy、sprintf与memcpy ...
标题 "c.c++资料总结.rar" 暗示了这个压缩包包含的是关于C语言和C++编程语言的学习资源和总结。描述中的文件名揭示了具体包含的内容:一个关于C++面试题的文档(c++mianshiti.doc),一个C语言知识的总结文档(c知识...
C语言和C++是两种广泛使用的编程语言,它们在许多方面有着显著的差异。C语言是一种面向过程的编程语言,由Dennis Ritchie在1972年创建,以其高效和灵活性著称,广泛应用于系统软件开发、嵌入式系统以及各种科学计算...
总结,C语言和C++是两种互补的编程语言,掌握它们的关键知识点能够帮助开发者在不同的项目场景中游刃有余。无论是C语言的底层控制还是C++的面向对象设计,都是程序员必备的技能。深入理解并熟练运用这些知识点,将有...
总结来说,C语言注重过程和数据结构,而C++侧重于对象模型和类的设计。两者在应用场景上有明显的区分,C语言常用于系统编程和嵌入式系统,而C++则更适合大型项目开发和需要面向对象特性的软件设计。开发者根据项目...
- **C 与 C++ 的兼容性**:由于C++和C有不同的名称解析规则,为了在C++中调用C语言编写的函数,需要使用`extern "C"`声明,告诉C++编译器以C语言的规则进行链接。 #### 七、构造与析构 - **构造函数**:构造函数在...
在C++中导入C函数,使用extern "C"关键字,以保持C语言的调用约定,避免因C++的名称修饰导致的不兼容问题。 C++从源代码到可执行文件的过程包括预编译、编译、汇编和链接四个步骤。预编译处理宏定义、条件编译和...