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可能不同,因此报告上述错误。改成后面的选项后就可以运行了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值