Time of Update: 2018-12-05
最簡單的是宏展開,很巧妙: #include <stdio.h>#define A(x) x;x;x;x;x;x;x;x;x;x;int main (){int n = 1;A(A(A(printf ("%d ", n++))));return 0;} 比較進階的是用C++的建構函式特性——對象建立時預設調用建構函式:#include <iostream>using namespace std;class A{static int i;public:A(){cout
Time of Update: 2018-12-05
我們都知道用printf( xxx )和fprintf( stdin, xxx )是一個效果。所以stdin是一個FILE*類型的變數。同樣的stdout和stderr也是。他們的定義在stdio.h(GNU實現)裡,其中部分代碼如下:/* Standard streams. */extern struct _IO_FILE *stdin; /* Standard input stream. */extern struct _IO_FILE *stdout;
Time of Update: 2018-12-05
restrict關鍵字restrict關鍵字其實是在C語言才有的,是C99提出來的,目前C++還不支援。當一個指標在聲明的範圍內,所有該指標指向的記憶體地區資料只能通過它訪問,而不能通過別的指標。編譯器會對此做檢查。這樣的後果是協助編譯器進行更好的代碼最佳化,產生更有效率的彙編代碼。由於目前只有C99支援,所以編譯命令如下:gcc -std=c99 test.c -o test.bin注意:g++不支援-std=c99,並且也不支援restrict關鍵字 例如:void f(const int
Time of Update: 2018-12-05
所謂內建,就是無需標頭檔就可以使用的函數。今天讀一段C++標準庫的代碼,看到type_traits檔案中調用了一個__is_enum函數,但是找不到函數定義。以下所列函數都是編譯器為了支援標準庫而內建的函數。__is_member_object_pointer __is_member_function_pointer __is_enum __is_union __is_class __is_function __is_standard_layout __is_pod __is_empty
Time of Update: 2018-12-05
new expression這是最常見的一種用法,例如:class A{ int a; };A* array = new A[101];全域的operator new這是C++標準庫為程式員準備的一個預設操作符函數,返回一個對象記憶體,但是不做對象的構造,它的作用和malloc類似,但是它可以拋出異常,預設的是bad_alloc,例如:A* array = (A*) ::operator new( sizeof(A) * 101 );對象的operator
Time of Update: 2018-12-05
1、undefinedreference to '__gxx_personality_v0'編譯器用的是gcc,請換成g++2、將一個源檔案由.cpp 改為.cc
Time of Update: 2018-12-05
1 調用strtok,會修改你輸入的參數。我剛剛犯了一個錯誤,就是先調用了strtok,然後才檢查字串,結果沒有按預期。// 錯誤char buf[256] = "0,100";char* res = strtok( buf, ",;" );if( buf[0] == '0' && buf[1] == '\0' ) return -1;// 正確char buf[256] = "0,100";if( buf[0] == '0' && buf[1] == '\
Time of Update: 2018-12-05
若要設定一塊記憶體為指定值,最簡單莫過於memset了,然而它要求pattern是一個位元組,如果想設定一個寬點的類型,例如整型,那麼memset基本就無法發揮功效,除非設定的是0或者-1或者其它值能滿足所有位元組一樣。 下面提供幾個方法,並大致比較一下:1> 普通的for迴圈,一次設定數組各個元素為指定值2> 滾動拷貝,1變2,2變4,4變8,越來越多……3> Duff's Device,
Time of Update: 2018-12-05
在linux裡,提到網路編程,就會涉及到select,多工IO,雖然這個效率不是很高,但是對於一般應用還是足夠了。我寫了一個小程式,如下: #include <sys/select.h>#include <sys/socket.h>#include <stdio.h>#define NUM 2000int fds[NUM];int main(){ for( int i = 0; i < NUM; ++i ) { printf("
Time of Update: 2018-12-05
不久的將來將會建立一個c++庫source:#include <stdio.h>extern "C" int main(int argc, char *argv[]);extern "C" void text_puts(int x, int y, const char *str, char c);int main(int argc, char *argv[]){ text_puts(20,10, "Jicama OS Platform First c plus plus (C++)
Time of Update: 2018-12-05
因為總覺得上回寫的C++代碼太過蹩腳了,心有不甘。畢竟C++是一個很優秀的語言,並且有著眾多出色的模板庫,這麼簡單的一個小程式被我給用成那樣,真的是太慚愧了。代碼絕對不應該這麼臃腫。實際上我有幾個概念模糊不清了,所以導致了代碼的臃腫,一個是輸入輸出資料流的概念模糊了,還有一個是Regex應用不熟悉。於是重溫了輸入輸出資料流,並且詳細的閱讀了Regex的Boost庫的說明文檔。新寫的代碼如下,明顯比原來的代碼優雅了許多:#include <string> #include
Time of Update: 2018-12-05
最後用C++實現了一把,因為STL中尚未包含Regular Expression,因此我使用了Boost中的Regex++。不過因為不是很熟悉,所以代碼很蹩腳,將就看了。呵呵。#include <string> #include <boost/regex.hpp> #include <iostream> #include <fstream> using namespace std; void readFile( const char*
Time of Update: 2018-12-05
預備知識:WMI(Windows Management Instrumentation)是內建在 Windows 系列作業系統中核心的管理支援技術,目前WMI 已經是一種規範和基礎結構,通過它可以訪問、配置、管理和監視幾乎所有的 Windows 資源例如磁碟、事件記錄、檔案、檔案夾、檔案系統、網路組件、作業系統設定、效能資料、印表機、進程、註冊表設定等等。WQL(WMI Query Language)就是內建在WMI中的查詢語言,它是 SQL
Time of Update: 2018-12-05
起因是因為一片文章,問到了一個問題,文章是這樣的:Originally Posted by 人就是這樣我想編一個程式,但學CompSci是很久以前的事情了。想請教請教大家。有兩個txt檔案,一個叫source.txt(有很多資料), 一個叫target.txt(空白的)我想把source.txt裡的一些資料提取出來(稍微修改一下),然後寫到target.txt裡面。舉個例子:sourse.txt裡的資料:2oi)4@##(
Time of Update: 2018-12-05
上回書說到,如果用C語言來判斷系統的位元組儲存順序 Little endian 和 Big endian ,函數如下: #include <stdint.h> #include <stdio.h> #include <stdlib.h> union TestEndian_Unit { uint16_t value; uint8_t bytes[2]; };
Time of Update: 2018-12-05
之前寫過一篇小短文:《[科普小短文]在C#中調用C語言函數》,是在Windows平台下基於Microsoft.Net的一個例子。今天我們來做另外一個小例子,是在Linux平台下基於Mono的例子。關於在C#中調用C語言函數的具體技術P/Invoke,在之前那篇文章《[科普小短文]在C#中調用C語言函數》中有介紹,不瞭解的讀者可以去看一下,這裡不多介紹了,直接來看我們的例子。一、準備動態連結程式庫C語言原始碼:Test.c 和我們之前那個Windows平台的代碼是一致的:int sum(int
Time of Update: 2018-12-05
在方法、屬性的繼承中,new關鍵字表示隱藏基類的實現,使得子類也可以定義與基類同名同形參的方法和屬性。而override關鍵字表示重寫,基類的方法或屬性在子類中被重寫後,調用子類的方法或屬性一定會從子類執行。說得可能很拗口,但是舉個例子一看就明白了。先看new關鍵字的例子:基類 ControlModel.csusing System;namespace InhibitPropertyDemo{ public class ControlModel { private
Time of Update: 2018-12-05
文章目錄 1. 最開始用最簡單的DataAdapter.Fill(DataTable)的辦法。2. 我嘗試用DataReader讀入資料,然後寫進dtDest3. 純SQL語句。不用DataTable4. 不輸出到資料庫,以CSV輸出到文字檔5.匯出到XML
Time of Update: 2018-12-05
共用一堆位操作相關的方法:// -----------------------------------------------------------------------// <copyright file="UInt64MaskHelper.cs" author="Yaping Xin">////// File Name : UInt64MaskHelper.cs// Description : Helper class to
Time of Update: 2018-12-05
這兩天又看了幾眼Socket編程,我老是沒長性,總是東看看西看看。還老愛挑毛病,鑽牛角尖,真是不可救藥了。這不,又開始看Socket不順眼了。當時是看了一個朋友給我的一段socket raw編程的代碼,有一段看的我很噁心。如下:if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0){ printf("WSAStartup failed: %d/n",ErrorCode); return 2; }