C++学习中遇到的问题
一、#ifndef的作用?
以下文件在"os_cpu.h"中。
#ifndef __OS_CPU_H__
#define__OS_CPU_H__
/*
中间有许多定义啦声明啦!;;
*/
#endif/*__OS_CPU_H__*/
这样,在编译阶段(ifndef是在编译阶段起作用滴!)假设有两个文件同时include了这个文件(os_cpu.h),这两个文件如果一个先编译了,那么__OS_CPU_H__就被定义了。当编译到第二个文件的时候,那么在开始的判断(ifnef)就会自动跳出os_cpu.h这个文件的重复编译。这样就避免了重复编译文件。
二、stdafx.h的作用?
避免重复执行include中的.cpp文件
你编写的任何.cpp文件都必须首先包含stdafx.h。
AppWizard编译stdafx.cpp之后生成stdafx.pch文件,VC之后编译.cpp文件阅读并使用.pch文件,不再编译Windowsinclude文件,除非你编辑了stdafx文件
三、char** argv、char* argv、char *argv[]区别
char *a:a的值包含字符型数据,取消对a的引用(*a)得到一个字符,
不取消引用得到一个字符串,printf("%c",*a)输出一个字符或者printf("%s",a)输出字符串;
char **a:a的值包含一个地址,该地址包含字符字符型数据,取消对a的引用(*a),得到该地址,再取消对该地址的引用(**a),得到一个字符,printf("%c",**a)输出一个字符printf("%s",*a)输出字符串;
char *a[]:a是一个数组,数组的元素是地址(地址其实就是指针),地址包含的值是字符型数据,printf("%c",*a[i])输出一个字符,printf("%s",a[i]))输出字符串;
char *a或char**a可以改变a的值,char a*[]不能改变a的值。
main(int argc, char*argv[]){ } // 没有区别
main(int argc, char**argv){ } // 没有区别
例如命令行:
aaa.exe x.dat 5 6
程序里使用时,把argv看成一组字符串数组。
argc 得 4。
argv[0]是命令行第一个位置变量,就是程序名。aaa.exe
argv[1]是命令行第二个位置变量,参数一: x.dat
argv[2]是命令行第三个位置变量,参数二: 5
argv[3]是命令行第三个位置变量,参数三: 6
程序里使用:
char namein[80];
int nx,ny;
printf("Theprog is %s\n",argv[0]); // 打出可执行程序名 aaa.exe
strcpy(namein,argv[1]);// 输入文件名从参数一获得 x.dat
sscanf(argv[2],"%d",&nx);// nx 得 5
sscanf(argv[3],"%d",&ny);// ny 得 6
四、LINK : fatal error LNK1123: failure duringconversion to COFF: file invalid or corruptIncremental Linking是什么?它有什么作用?
IncrementalLinking翻译成中文就是“增量链接”,是一个链接的参数选项,作用就是为了提高链接速度的。什么意思呢?不选用增量链接时,每次修改或新增代码后进行链接时会重新洗牌,把原来的.exe删了,重新链接成一个新的.exe,这样对于大型项目来说链接会比较慢。而选用增量链接时,在对代码做小的改动时会把新成的函数或数据穿插到已有的.exe中,而不重新生成.exe,只有做了大量修改时才可能会重新编排,这样就可以提高链接的速度。
一般VS的默认设置会把Debug版的IncrementalLinking设置成Yes (/INCREMENTAL),而把Release版的设置成No (/INCREMENTAL:NO)。
五、C++的输入和输出
可以沿用C的printf("");scanf("");
C++有自己的输入和输出cin和cout
#include<iostream>
voidmain()
{std::cout<<"HelloWorld"<<endl;}
}
或者
#include<iostream>
usingname space std;
voidmain(){
cout<<"HelloWorld"<<endl;
}
常用的一些I/O操作符:
dec |
格式化为十进制数值输入输出 |
hex |
格式化为十六进制数值输入输出 |
oct |
格式化为八进制数值输入输出 |
setiosflags(long flag) |
设置flag中指定的标志位输入输出 |
resetiosflags(long flags) |
清除flag中指定的标志位输入输出 |
ws |
设置跳过输入中的签到空白字符输入 |
setw(int width) |
设置输出数据段宽度为width输出 |
set precision(int num) |
设置浮点数精度位数输出 |
setfill(int ch) |
设置ch为填充字符输出 |
endl |
输出一个换行符并刷新流输出 |
ends |
输出一个空字符‘\n’以结束字符串输出 |
flush |
制刷新流输出 |
1、 设置了单元测试覆盖率,调试结束结果:没有为此测试运行启用代码覆盖率。
问题分析:调试不能启动启用代码覆盖率。
解决:从菜单“测试”-“运行“-“当前文中上下的测试”,就可以查看到代码覆盖率了。
2、 当前上下文找不到名称”Int32”。
问题分析:当前测试架构缺乏引用
解决:在测试代码手动添加UsingSystem;就好了。
3、 创建数据驱动单元测试,在测试视图-数据连接字符串-链接数据源时,只能看到database\cvs\xml,找不到excel\access等其他文件数据源。
问题分析:数据库有记忆功能
解决:选择“database”-“下一步”-“新建连接”-点击“数据源”项后的“更改”按钮,便可以看到所有的数据源连接方式。
4、 创建数据驱动单元测试,在测试视图-数据连接字符串-链接数据源时,,尝试获取表列表时出错,请确保有效连接。
问题分析:应该是链接字符的问题,在数据库服务器名称中使用了“.”或”mydataserver“来代替本地数据库地址。
解决:不能使用.”或”mydataserver“来代替本地数据库地址(尽管你测试链接可以通过,后续也要报错,估计是VS本身bug)。应该使用IP地址格式,如192.168.1.66,就没问题了。
5、 数据驱动单元测试,连接号了数据源,然后再去更改了数据源,运行测试程序,结果没发生变化。
问题分析:VS不能自动动态的加载数据源
6.Skipped Rebuild All: Project: Hello
Debug win32,如果不是win32就会报出这个错误
7. error PRJ0002 : Error result 31 returned from 'C:\ProgramFiles\Microsoft SDKs\Windows\v6.0A\bin\mt.
本来代码写的好好的,可以正常编译通过,突然编译的时候报error PRJ0002 :Error result 31 returned from 'C:\Program Files\MicrosoftSDKs\Windows\v6.0A\bin\mt.明明刚才还编译通过的,为什么现在出现这个错误呢,不知道,但是可以通过设置让其编译通过,在属性中设置link-->ManifestFile,然后设置Generate Manifest 为NO;
Visual Studio编译成功,运行时报这个错误:
没有找到MSVCR90.dll,因此这个应用程序未能启动,重新安装应用程序可能会修复此问题
解决方法是,项目-->C++-->代码生成 下的 运行时库 项目从Multi-threaded Debug DLL (/MDd) 改为 Multi-threaded Debug(/MT),因为 Multi-threaded Debug DLL(/MDd)需要项目建立者相同的MSVCR.dll库,而我们的系统中的DLL可能不同,因此报告上述错误。改成后面的选项后就可以运行了。