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