Time of Update: 2018-12-04
基礎: 一個.cpp對應一個obj,一個.obj就是一個編譯單元,多個編譯單元在連結的時候通過連結器連結,組成一個exe,就是一個程式。如果一個cpp需要另外一個cpp定義的函數,只需要在這個cpp中寫上這個函數的聲明就可以了,注意在連結的過程中如果有同名的函數或者變數在不同的obj中,程式運行會報錯。(實際上在編譯的時候,就會提示出現重定義的錯誤。)在實際的調試過程中發現,變數的重定義在編譯的過程中能夠立即檢測出來,而函數的重定義則不同,如果你首先在一個cpp裡面實現該函數的定義,然後運行成
Time of Update: 2018-12-04
大多程式員在學C++前都學過C,並且習慣於C風格(類型)轉換。當寫 C++(程式)時,有時候我們在使用static_cast和reinterpret_cast時可能會有點模糊。在本 文中,我將說明static_cast實際上做了什麼,並且指出一些將會導致錯誤的情況。泛型(Generic Types) float f = 12.3; float* pf = &f; // static cast // 成功編譯, n = 12
Time of Update: 2018-12-04
在C語言的學習中,對記憶體管理這部分的知識掌握尤其重要!之前對C中的malloc()和free()兩個函數的瞭解甚少,只知道大概該怎麼用——就是malloc然後free就一切OK了。當然現在對這兩個函數的體會也不見得多,不過對於本文章第三部分的內容倒是有了轉折性的認識,所以寫下這篇文章作為一個對知識的總結。這篇文章之所以命名中有個“淺談”的字眼,也就是這個意思了!希望對大家有一點協助!如果不扯得太遠的話(比如說作業系統中虛擬記憶體和實體記憶體如何運做如何管理之類的知識等),我感覺這篇文章應該是比
Time of Update: 2018-12-04
[使用command line mode作profile的方法][下載範例:HelloWorld]1.首先開啟您的workspace:2. 選擇Project -> Settings...3. 點選Link,勾選Enable profiling. 按OK完成設定.4. Select Build -> "Build" or "Rebuild All" to build your workspace5. build完成後, 點選Build -> Profile...
Time of Update: 2018-12-04
這次因為項目被劃分成多個dll模組,而且在某個dll模組中new出來的記憶體塊可能會穿越其他的dll,最後可能不是在它出生的那個dll中被銷毀,這會導致記憶體配置回收出現問題。 考慮了一下,決定由一個dll模組單獨的維護記憶體申請和釋放,其他任何需要動態申請記憶體的模組都調用該dll中的介面即可。不過在實際操作中,有一點點問題:我本來是希望在dll中重載好new和delete,這樣其他模組只要和dll連結就可以,最大限度複用代碼。但是實際上實驗下來是不行的。new重載後公開為匯出函數倒是沒問題,
Time of Update: 2018-12-04
Trait技法的最初目的是為了系統管理範本參數,有的時候模板中需要幾個參數,但是往往有些參數是與main parameters緊密相關的,這時候可以使用trait技巧,從幾個主要的模板參數中推匯出相應的secondary template argument,並以預設範本參數的形式出現在模板中。實際上使用的trait技巧執行個體往往會有效地提高程式的效率,下面我結合STL小小的說說trait的實際運用。1、SGI
Time of Update: 2018-12-04
(一) 一般對於遵循GNU 規範的c 編譯器,例如gcc(3.0以及 以上版本)具有__attribute__機制,而對於非GNU的c 編譯器例如vc等,也可以做到在main()之前或者之後執行其他函數,如果不能也能做到和非GNU編譯器的相容。因為__attribute__設計的非常巧妙,很容易作到和其它編譯器保持相容,也就是說,如果工作在其它的非GNU編譯器上,可以很容易的忽略該屬性。通過預先處理就可以實現。 #ifndef __GNUC__ #define
Time of Update: 2018-12-04
Listing 1 time1.c - 採用不同格式輸出當前的日期和時間#include <stdio.h>#include <time.h>#define BUFSIZE 128main(){ time_t tval; struct tm *now; char buf[BUFSIZE]; char *fancy_format = "Or getting really fancy:\n" "%A, %B %d, day %j of %Y.\
Time of Update: 2018-12-04
經常測試代碼的運行耗時,以下代碼可以實現1. clock()方法,該方法時間精度為毫秒。#include <time.h>#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){clock_t startTime,endTime;startTime = clock();{***};endTime = clock();cout<<"cost time(ticks):
Time of Update: 2018-12-04
1 c編譯器預先處理功能字串替換,包含標頭檔,通用模組擴充2 關於編譯器的特性不可移植的代碼未確定的未定義的壞的代碼編寫可移植的代碼:1)最好嚴格遵循語言標準 ,只使用已經確定的特性2)不突破任何由編譯器所實現的限制 3)對於未確定的、未定義的、不產生依賴代碼3 關於通用模組擴充(宏的使用)一般宏用法,括弧會產生錯誤的表達形式#define a(x) a_expanded(x)a(x);等價於 a_expanded(x)如果有空格 #define a (y) a_expanded (y)a(x)
Time of Update: 2018-12-04
reverse和resizevector
Time of Update: 2018-12-04
應包含的標頭檔#include <stdlib.h>#include <time.h> //用時間作隨機數種子幾個主要的函數:randomize() ;//啟動隨機數產生器rand(); //產生一個0~RAND_MAX(32767)之間的隨機數int random(int N);// 產生0~N-1之間的隨機數srand(unsigned int seed); //以seed作為種子來啟動隨機數產生器time_t
Time of Update: 2018-12-04
轉載地址:http://blog.sina.com.cn/s/blog_4a72b0f60100r7ad.html多線程中,線程需要暫停原因多種多樣,基本分為兩大類,1是等待資料,2是系統資源緊張,停止計算以把資源讓給其他線程.一般初學者會使用的方法就是使用SuspendThread和ResumeThread這兩個API或者他們的封裝函數進行操作,許多教材上都是這麼說的,但這麼作會帶來及其嚴重的問題。這兩個API的問題是無法確定函數被暫停位置,這是一個足以讓任何多線程程式崩潰的問題。想象一種情況
Time of Update: 2018-12-04
C++ primer 上面的一個例子: // constRef.cpp : 定義控制台應用程式的進入點。//#include "stdafx.h"class constRef{public: constRef(int ii); int i; const int ci; int &ri;};constRef::constRef(int ii){ i=ii; ci=ii; ri=i;}//constRef::constRef(int ii):i(ii),ci(i),ri(ii){}int _
Time of Update: 2018-12-04
參數傳遞 (1)形參的初始化與變數的初始化一樣,如果形參具有非參考型別,則複製實參的值,如果形參是參考型別,則它只是實參的別名。舉例如下:#include "stdafx.h"void swap(int v1,int v2){ int tmp=v2; v2=v1; v1=tmp;}int _tmain(int argc, _TCHAR* argv[]){ int i=10; int j=20; printf("before
Time of Update: 2018-12-04
#include "stdafx.h"#include "memory.h"void memset_1(unsigned char *&v1){ unsigned char *ptmp=(unsigned char *)v1; memset(ptmp,100,20);}int _tmain(int argc, _TCHAR* argv[]){ unsigned char *pchar=new unsigned
Time of Update: 2018-12-04
// pointer_control2.cpp : 定義控制台應用程式的進入點。//#include "stdafx.h"class U_Ptr { friend class HasPtr; int *ip; size_t use; U_Ptr(int *p): ip(p), use(1) { } ~U_Ptr() { delete ip; }};/* smart pointer class: takes ownership of the dynamically allocated*
Time of Update: 2018-12-04
1)定義的結構體 不初始化;2)sprintf是不安全的; 如果不注意這兩點,有可能對軟體的健壯性有影響! 3)if(1<x<3) Vc編譯器不報錯,應該成if(x<3&&x>1) 4)memset(buffer,0,size) 應該改成memset(buffer,0,size*sizeof(Type)) ,比如int型和byte型是不同的,尤其在影像處理中將某一行置0的情況; 5)(25/31)*255
Time of Update: 2018-12-04
C++的std::string的“讀時也拷貝”技術!趙錕原文:http://coolshell.cn/?p=1443 C++的std::string的讀時也拷貝技術!嘿嘿,你沒有看錯,我也沒有寫錯,是讀時也拷貝技術。什麼?我的錯,你之前聽說寫過時才拷貝,嗯,不錯的確有這門技術,英文是Copy On Write,簡寫就是COW,非常’牛’!那麼我們就來看看這個’牛’技術的效果吧。我們先編寫一段程式01.#include <string> 02.#include
Time of Update: 2018-12-04
一、雞肋 C庫函數的檔案操作是獨立於具體的作業系統平台,不管在DOS、Windows、Linux還是在VxWorks中,都是這些函數,所以基於C庫函數的檔案操作平台獨立性、可移植性更強一些二、C檔案操作庫函數 1、開啟檔案操作:FILE * fopen(const char * filename,const char * mode); fileame: 開啟的檔案名稱(要包含檔案名稱,預設為當前路徑)