1. 程式人生 > >C++學習中遇到的問題

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可能不同,因此報告上述錯誤。改成後面的選項後就可以運行了。