目前分類:C語言 (11)

瀏覽方式: 標題列表 簡短摘要

今天做了一個錯誤的決定, 想說在一堆 C 程式裡呼叫另一堆 C++ 程式。邊弄邊學, 最後發現什麼都沒改的情況, 改用 g++ link 原本的 C 程式就會爆炸。想想還是撿要用的一小部份程式出來, 另寫 C 的程式比較單純。不過也藉這機會, 才讓我真的搞懂這之中發生什麼事。

先附上要用的範例, 再來慢慢廢話, 沒耐心的人直接玩範例可能就懂了。

原始碼

/* b.h */
#ifndef _B_H_
#define _B_H_

#ifdef __cplusplus
extern "C" {
#endif
int add(int a, int b);
#ifdef __cplusplus
}
#endif
#endif 

/* b.cpp */ #include "b.h" int add(int a, int b) { return a + b; }

/* a.c */ #include <stdio.h> #include "b.h" int main(void) { printf("%d\n", add(3, 5)); return 0; }

 編譯方式

$ gcc -c a.c
$ g++ -c b.cpp
$ g++ a.o b.o -o a
$ ./a                    # 輸出 8

 

說明

《How to mix C and C++  Updated! , C++ FAQ》將 C 和 C++ 互相呼叫的各式注意事項寫得相當清楚, 不愧為 FAQ 啊! 其中在 C 呼叫 C++ 的函式時, 要注意幾點 C++ 有 name mangling, 也就是不管是 class method 還是 function, 名稱 X 編出來都不會是 X, 而 C 通常沒有 name mangling。不過不管 C 是否有 name mangling, 關鍵是讓 C 能用 C 的方式認得 C++ 的 symbol。

先明白編譯、連結時發生了什麼事, 從這裡出發, 可知要讓 C 呼叫到 C++ 的函式, 要從幾個地方下手:

ryan0988 發表在 痞客邦 留言(0) 人氣()

这里说的不是类模板的偏特化,而是偏序函数模板。这个特性在C++标准中并不太明确,各家编译器对它个特性的工作细节可能会有些差异。

先来看看一个例子:

//filename:function_partial_order.cpp

//wirtten by saturnman

#include<iostream>

usingnamespace std;

//function template partial order feature

template<typename T>

void func1(T t)

{

ryan0988 發表在 痞客邦 留言(0) 人氣()

C/C++中的volatile使用時機?

.不知各位對volatile(揮發性的)這個字陌不陌生? 我相信大家在一些程式或多或少都看
 過這個字眼, 但是究竟要在何種場合用它呢?
.當然一定是有需要, C/C++才會有這個保留字, 否則只是增加programmer的困擾而已
.有2兩個場合(I/O & multithread program), 供各位參考!
.請大家check自己的程式中(尤其是第2個場合), 若有的話請記得加上volatile

1. I/O, 假設有一程式片斷如下

       U8   *pPort;
       U8   i, j, k;
      

ryan0988 發表在 痞客邦 留言(0) 人氣()

 

<本文轉錄自 ptt.cc BBS 站 C_and_CPP 板 FAQ 作者:Khoguan Phuann>

Q: 有時會看到人家提到 C89, C90, C99, C++98, 或 C++03, 那是啥?

A: 是俗稱 C 或 C++ 的標準的版本,數字指的是年代。

C89 是 ANSI(美國國家標準局)定的,通過於 1989 年底,出版於 1990 年春,正式編號是 ANS X3.159-1989。C89也就是所謂的 ANSI C。

C90 是 ISO(國際標準組織)承襲自 ANSI 的 C89 而定的國際標準,美國也跟著採用了。C90 的核心內容和 C89 一樣。C90 的正式編號是ISO/IEC 9899:1990。

ryan0988 發表在 痞客邦 留言(0) 人氣()

[此篇文章並非原創若有冒犯敬請來信告知]

return與exit()的差別

同事問我:在main()裡面return,跟在main()裡面呼叫system call exit()有什麼不同? 我的觀念不算太清楚,所以整理一下網路上讀到的說法。

在main()裡面return,跟在main()裡面呼叫system call exit()是唯一兩者效果相同的地方,兩者的效果均為結束process。

若在main以外的函式裡呼叫return,local variables即從stack裡消失,返回呼叫此函式的地方。若呼叫exit,則該process就此結束、不會返回。

此外,可以使用atexit()或on_exit()註冊一個函式,結束process前,會呼叫該函式。

參考資料:
  1. difference between exit and return
  2. return statement vs exit() in main()

ryan0988 發表在 痞客邦 留言(0) 人氣()

作者:吳文力

摘要:
本文從介紹基礎概念入手,探討了在C/C++中對日期和時間操作所用到的數據結構和函數,並對計時、時間的獲取、時間的計算和顯示格式等方面進行了闡述。本文還通過大量的實例向你展示了time.h頭文件中聲明的各種函數和數據結構的詳細使用方法。

關鍵字:UTC(世界標准時間),Calendar Time(日歷時間),epoch(時間點),clock tick(時鐘計時單元)


1.概念
在 C/C++中,對字符串的操作有很多值得注意的問題,同樣,C/C++對時間的操作也有許多值得大家注意的地方。最近,在技術群中有很多網友也多次問到過 C++語言中對時間的操作、獲取和顯示等等的問題。下面,在這篇文章中,筆者將主要介紹在C/C++中時間和日期的使用方法.

ryan0988 發表在 痞客邦 留言(0) 人氣()

偶然於 7zipLZMA sdk 裡發現非常簡潔的 UTF-8/UTF-16 變換函數,連一般轉換成 Unicode 的中介動作也省去了。可惜它本身的解壓功能未能滿足遊戲裝載系統的要求,皆因 7zip 的 archive 格式不能以最少的資源去解壓 archive 裡的個別檔案。
以下源始碼引用 LZMA sdk 再加上本人所寫的額外錯誤偵測與註解,enjoy!

typedef byte_t unsigned char;
static const byte_t cUtf8Limits[] = {
0xC0, // Start of a 2-byte sequence
0xE0, // Start of a 3-byte sequence
0xF0, // Start of a 4-byte sequence

ryan0988 發表在 痞客邦 留言(0) 人氣()

大陸論壇上找到的分享之

Problem:


目的:試圖open一個文件,若文件不存在就建立它。
open(pathname, O_RDWR | O_CREAT,0666);就不行吗?为什麼好多資料上說要加O_EXCL,說是唯一單體的運動方式,不加難道就不是了嗎?不解

說的是,但目的是“試圖open一个文件,若檔案不存在就建立它。”再加這一句讓它返回一个錯誤有什麼用呢?如果檔案存在反而不能打開這個檔案,如果要測試檔案是否存在我只要一個O_EXCL不就行了。很多資料上都是O_CREAT | O_EXCL, 我實在不知道這樣做的用途何在?

Answer


哦,我還以為弄清楚了呢,結束帖子了。

設想這樣一個需求:某個任務要求只能單個進程執行,不能多個進程同時執行。
但是不能確保多個進程同時啟動,嘗試執行這個任務。

ryan0988 發表在 痞客邦 留言(0) 人氣()

寫程式經常會用到編譯器預先定義的巨集 (Predefined Macros),例如:__FILE__、__LINE__、__DATE__、__TIME__、__func__ 等。這些巨集有些是標準 C/C++ 語言所定義的,有些則是編譯器自行定義的。使用 GNU C/C++ 的人,可參考以下資料:

Predefined Macros (GNU C/C++)

這份資料所提到的 System-specific Predefined Macros 是指針對不同的系統平台 (arm、mips 等),編譯器所預先定義的特殊巨集。若想直接看看這些預先定義的巨集,可執行以下指令:

echo | gcc -dM -E - | sort

使用 Microsoft 系列編譯器的人,可參考以下資料:

Predefined Macros (MSDN)

轉貼自http://softsmith.blogspot.tw/2009/07/cc-predefined-macros.html

這位版主寫了一句話與大家分享之"靠軟體謀生真不易... 勤作筆記,幫助記憶..."


ryan0988 發表在 痞客邦 留言(0) 人氣()

unlink 其實就跟 rm 一樣罷了,當要移除一個 symbolic link ,有時發現怎樣移不掉,一直說 "unkink: my_symbolic_link/ : is a directory" ,這個訊息就跟使用 rm 去移除一個目錄時的錯誤訊息!原來,在移除一個 symbolic link 時,要留意後面不能加個 "/" !這樣,若 symbolic link 是連到一個目錄時,等同於在對那個目錄做 rm 的動作,才會顯示 "is a directory" 訊息。這時可不能一氣之下用 rm -rf !可會將 link 到的目錄給移除掉的!要額外小心。

  • 目的地是一個檔案
    • # ln -s target_file my_file_link
    • # unlink my_file_link
  • 目的地是一個目錄
    • # ln -s target_dir my_dir_link
    • # unlink my_dir_link/
      • unlink: my_dir_link/: is a directory
    • # unlink my_dir_link
      • Done

 

 

轉貼自http://changyy.pixnet.net/blog/post/19268474


ryan0988 發表在 痞客邦 留言(0) 人氣()

看到以下這段 code 真是一頭霧水:

 
#define __stringify_1(x...) #x
#define __stringify(x...)__stringify_1(x)    // pre-scan
 
先說 #define 後面放 #x 的意思,
它是要把 #define 的參數展開成字串。
e.g. 在 #define _A(x) #x 下,_A(hahahaha) 會被展開成 "hahahaha"。
 

ryan0988 發表在 痞客邦 留言(0) 人氣()

Close

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

reload

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼