说明:在初学的时候遇到了一些问题,基本上忘记了是自己总结的还是查阅后保存的,如有雷同,请告知,大家一起学习!
1.stdafx.h是什么
名称的英文全称为:StandardApplication Framework Extensions
所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。
预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。
编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令,使用projectname.pch编译这条指令之后的所有代码。
因此,所有的MFC实现文件第一条语句都是:#include "stdafx.h"。
2.调试和运行快捷键的区别
F5是执行到断点处!目的是为了调试
Ctrl+F5全部执行! 目的是为了执行
不知道我说明白了没?
3.namespace是什么
所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
下面以iostream与iostream.h为例来谈谈区别:
前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
namespace是指标识符的各种可见范围
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:
直接指定标识符
例如std::iostream而不是iostream。完整语句如下: std::cout<< std::hex << 3.4 << std::endl;
使用using关键字
using std::cout; using std::endl; using std::cin;以上程序可以写成如下代码:
using std::cout <<using std::hex << 3.4 <<using std:: endl;
使用usingnamespace std
例如:
#include<iostream>
#include<sstream>
#include<string>
using namespace std;
这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写: cout << hex << 3.4 <<endl; 因为标准库非常的庞大,所以程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。所以就有了<iostream>和<iostream.h>等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h"
4.sln和vcproj有什么区别?
vcproj 是工程文件, sln 是解决方案文件。一个解决方案里面可以包含多个工程。
你打开 vcproj 文件编译不了可能是因为这个工程里面用到了同一个解决方案中其它工程的
5.printf函数与sprintf不同之处有:
(1)函数的声明不同
int printf(const char *format [, argument]...);
int sprintf(char *buffer, const char *format [, argument] ...);
sprintf比printf多一个参数buffer,这个参数的作用见(2)的描述。
(2)函数的功能不同
- 函数printf(...)根据指定的格式(format)将参数(argument)输出到屏幕上;
- 函数sprintf(...)根据指定的格式(format)将参数(argument)输出到由指针buffer指定的字符数组(字符缓冲区)中;
(3)用法举例
#include <stdio.h>
void main()
{
/*字符数组buffer用于存放sprintf函数的输出*/
char buffer[256];
int x = 100;
char *message = "Hello world";
/* 用sprintf函数将x和message输出到字符数组buffer中 */
sprintf(buffer, "%s%d", message, x);
/* 用printf函数将buffer的内容输出到屏幕上显示 */
printf("%s\n", buffer);
}
C语言:为什么用fprintf(stderr,"Error");比printf("Error");更好?
标签: C
一般情况下,你这两个语句运行的结果是相同的,没有区别,只有一下情况才有区别:
运行你的程序的时候,命令行上把输出结果进行的转向,比如使用下面的命令把你的程序a.c运行的结果转向到记事本文件a.txt:
a.exe > a.txt
在这样的情况,如果使用printf输出错误信息,会保存到a.txt文件里面,如果使用fprintf输出错误,会显示在屏幕上。
并且sprintf没有缓冲区,结果输出到磁盘文件中,没有缓冲区的问题
都是把格式好的字符串输出,只是输出的目标不一样:
1 printf,是把格式字符串输出到标准输出(一般是屏幕,可以重定向)。
2 sprintf,是把格式字符串输出到指定字符串中,所以参数比printf多一个char*。那就是目标字符串地址。
3 fprintf,是把格式字符串输出到指定文件设备中,所以参数笔printf多一个文件指针FILE*。
6.c++中this和*this
C++中的this指针是指对象中指向成员的 指针。
/
#include <iostream>
using namespace std;
class Base
{
public:
void output(int x,int y)
{
this->x=x;
this->y=y;
cout<<this->x<<" "<<this->y<<endl;
}
private:
int x,y;
};
int main()
{
Base base;
base.output(3,4);
return 0;
}
在VC++ 6.0下通过。
当你定义一个类,定义私有成员,然后你想要为它们赋值,这里用output()函数,函数的形参是:intx,int y和私有成员名一样,所以当你没有用this指针的话:
void output(int x,int y)
{
x=x;
y=y;
cout<<this->x<<" "<<this->y<<endl;
}
输出的就不是你想要的值。
*this指针指的是对象