トップ «前の日記(2006-08-20(日)) 最新 次の日記(2006-08-22(火))» 編集

とた日記


2006-08-21(月) 曇 安静時心拍数 62 [長年日記]

_ プログラミングRuby 第2版 言語編(Dave Thomas/Chad Fowler/Andy Hunt/田和 勝/まつもと ゆきひろ)

満を持しての登場。前著 プログラミングRuby―達人プログラマーガイド(デビット トーマス/アンドリュー ハント/まつもと ゆきひろ/David Thomas/Andrew Hunt/田和 勝)は内容が古いので買うに買えませんでした。 プログラミングRuby 第2版 ライブラリ編(Dave Thomas/Chad Fowler/Andy Hunt/田和 勝/まつもと ゆきひろ)とで2冊に分かれています。

_ はじめてのRuby on Rails―話題の「Webアプリケーション・フレームワーク」が使える! (I・O BOOKS)(清水 美樹)

いくら流行りといえどもRuby on Rails本は出過ぎでは?

_ C言語関数からC++言語メソッドのコールを試す

まず、ヘッダファイルを作ります。

% cat hoge.h
#ifndef __HOGE_H__
#define __HOGE_H__
 
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
 
        extern void get(int ID, double *fuga);
        extern void set(int ID, double fuga);
 
#ifdef __cplusplus
}
#endif /* __cplusplus */
 
#ifdef __cplusplus
/** 
 *  普通にC++からも呼べるように用意しておく。
 */
class HOGE {
public:
        int get(int ID, double *fuga);
        int set(int ID, double fuga);
};
#endif
 
#endif /* __HOGE_H__ */

次に中味の hoge.cpp

% cat hoge.cpp
#include <iostream>
#include "hoge.h"
 
int HOGE::get(int ID, double *fuga)
{
        *fuga = 0.1;
 
        return 0;
}
 
int HOGE::set(int ID, double fuga)
{
        return 0; // 面倒なのでダミー
}
 
void get(int ID, double *fuga)
{
        HOGE obj;
        obj.get(ID, fuga);
}
 
void set(int ID, double fuga)
{
        HOGE obj;
        obj.set(ID, fuga);
}

メイン

% cat main.c
#include 
#include 
#include "hoge.h"
 
int main(int argc, char **argv)
{
        int ID;
        double fuga;
 
        ID = 100;
 
        get(ID, &fuga);
 
        printf("ID = %d, fuga = %f\n", ID, fuga);
 
        return EXIT_SUCCESS;
}

ビルドと実行

% g++ -Wall -c hoge.cpp
% gcc -Wall -c main.c
% g++ -Wall -o c_main hoge.o main.o
% ./c_main
ID = 100, fuga = 0.100000

期待通りにできました。当然、ピュアなC++からも呼びたい場合でも

% cat main.cpp
#include 
#include "hoge.h"
 
int main(int argc, char **argv)
{
        int ID;
        double fuga;
 
        ID = 100;
 
        HOGE hoge;
 
        hoge.get(ID, &fuga);
 
        std::cout << "ID = " << ID << ", fuga = " << fuga << std::endl;
 
        return 0;
}

ビルドと実行

% g++ -Wall -c hoge.cpp
% g++ -Wall -c main.cpp
% g++ -Wall -o cpp_main hoge.o main.o
% ./cpp_main
ID = 100, fuga = 0.1

できました。