FC2ブログ

【C言語】externとconstについて学ぶ【C++】

プログラム書いてて、円周率とかをプログラムごとに定義し直すのは如何様なものか…と。

というわけで共通にさせようと言う魂胆を持った。
これは分割コンパイルによって単独で動作保証されていたものの独立性を崩すのでオススメはしない。
自分は円周率とかの定数を変数として渡すのも、ファイルごとに定義し直すのもアレだったのでこれを使う事にした。


以下自分用のメモ。
externをつけることでどうやら外部リンケージになるようだ。
constの扱いがCとC++で違っているので注意。
Cだと外部リンケージなのだが、C++だと内部リンケージになっている。

ちなみに外部リンケージは外に見えている状態。

a.c, b.c, c.cというファイルがあったら(C言語)
~~~a.c~~~
(extern const int hoge;)
const int hoge=1;
~~~b.c~~~
extern const int hoge;
~~~c.c~~~
extern const int hoge;
で動く。

~~~a.c~~~
extern const int hoge=1;
~~~b.c~~~
extern const int hoge;
~~~c.c~~~
extern const int hoge;
でも動く。(推奨はしない)

~~~a.c~~~
extern const int hoge;
~~~b.c~~~
extern const int hoge;
~~~c.c~~~
extern const int hoge;
だとアウト。


次にC++の場合。
C++だとconstは内部リンケージなので、
~~~a.cc~~~
extern const int hoge;
const int hoge=1;
~~~b.c~~~
extern const int hoge;
~~~c.c~~~
extern const int hoge;
とする必要がある。
a.ccのextern const int hoge;の部分は必須。

~~~a.cc~~~
extern const int hoge=1;
~~~b.c~~~
extern const int hoge;
~~~c.c~~~
extern const int hoge;
でも良い。

Cのファイルならのexternは抜いても外部リンケージなので動作する。
C++の場合はconstを用いると内部リンケージになるので、他のファイルが持つ同じ名前の変数と競合してエラーがおこる。
スポンサーサイト



テーマ : ひとりごと。
ジャンル : 日記

【シェルスクリプト】変数が整数かどうか判断する

シェルスクリプトで変数が整数かどうかを評価する。

test ${hoge} -eq 0 2> /dev/null
result=$?

if [ ${result} -le 1 ]; then
echo "整数"
else
echo "整数じゃない"
fi


何がおこっているかの確認。

test ${hoge} -eq 0 2> /dev/null
test関数によって変数hogeが0と等しいかどうかを評価する。
hoge=0の場合は0を返す。
hogeが0以外の変数の場合は1を返す。
hogeが整数でない場合、エラー文を出力し、2を返す。

result=$?
一つ前のコマンド、シェル関数の結果を変数resultに代入する。

[ ${result} -le 1 ];
変数resultが0, 1ならば整数なので評価する。

【シェルスクリプト】シャープ、パーセントを使った文字列操作

${#変数}
で変数の文字列の長さ

${変数#パターン}
変数について、最初の部分とパターンがマッチしたら、最も短く一致する部分を取り除いた残りの部分を返す。
${変数##パターン}
変数について、最初の部分とパターンがマッチしたら、最も長く一致する部分を取り除いた残りの部分を返す。
${変数%パターン}
変数について、最後の部分とパターンがマッチしたら、最も短く一致する部分を取り除いた残りの部分を返す。
${変数%%パターン}
変数について、最後の部分とパターンがマッチしたら、最も長く一致する部分を取り除いた残りの部分を返す。

例)
STR=/a/b/c/d/e/hoge.10.txt

$ echo ${STR##/*/}
→hoge.10.txt
一番長い/~/は/a/b/c/d/e/

$ echo ${STR#/*/}
→/b/c/d/e/hoge.10.txt
一番短い/~/は/a/

$ echo ${STR%%.*}
→/a/b/c/d/e/hoge
一番長い.~は.10.txt

$ echo ${STR%.*}
→/a/b/c/d/e/hoge.10
一番短い.~は.txt

拡張子を変える場合は、
FILE=test.txt
$ echo ${FILE%.*}.dat

【UNIX】cut コマンドでフィードの指定【シェルスクリプト】

cut コマンドのオプション-f におけるデフォルトのデリミタ(区切り文字)はTABになっている。

変更する時は-d を使う


デリミタをコロンにする
$ cut -f1-3 -d:
デリミタをスペースにする
$ cut -f1-3 -d' '

もちろんアルファベットなどをデリミタに使うことも可能。

【tex】defとgdefでマクロを定義

"@" を使うので,\makeatletterと\makeatotherで囲む必要がある。

\def\hoge#1{\gdef\@hoge{#1}}

\hoge{~~~}


\@hogeが{~~~}に置き変わる

【CERN】Pad内にマージンを入れる【ROOT】

2次元ヒストグラムを描いた時に濃淡の度合いを表す数字が見切れる事があった。
それを解決するために、Pad内にマージンを入れた。

gStyle->SetPadTopMargin(0.1);
gStyle->SetPadBottomMargin(0.1);
gStyle->SetPadLeftMargin(0.115);
gStyle->SetPadRightMargin(0.135);

見切れている     見切れていない

【tex】チルダ

texで~は半角スペースに成り代わる。
texでは普段半角スペースは無視される。

texで~を打ちたい時は/textasciitildeを使うと良い。

【twitter】ツイート部分からDMを送る方法【メッセージ】

リプライ(返信)するには
@hoge 本文~~~


ダイレクトメッセージ(DM)を送るには
d hoge 本文~~~

これでhogeというアカウントの人にダイレクトメッセージを送れる。
中野梓
プロフィール

dhythm

Author:dhythm
関西に住む大学院生。専攻は宇宙物理学。
専攻が宇宙物理学の理学修士。現在は社会人。
Mac, Windowsを併用。Linuxでサーバーマシンをたてる計画中。
使用言語 : C, Java, COBOL, Perl, Python, Object-C

社会の荒波にもまれながら、日々勉強中。

アクセスカウンター
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード