eclipseで scanf を使う時の注意

 

eclipseのCDT(C/C++ Development Toolkit)でソース書いていた時につまづいてので、メモしておきます。

 

確認環境:Eclipse CDT 4.5.2

 

Eclipse CDTで、何気なく scanf を使って以下のコードを書いたのですが、実行しても、コンソールに何も表示されません。

以下のように、printf と scanf の間に、fflush(stdout); を追加すれば、

コンソールに、表示されるようになりました。

Visual Studio 中括弧 の位置をカスタマイズ

 

Visual Studio Community 2015で、「if」や、「while」と入力すると、自動的にコントロールブロックの中括弧 { } をつけてくれるのですが、

この中括弧 { }位置をカスタマイズする方法をメモしておきます。

 

確認環境:Visual Studio Community 2015

 

メニューから「ツール」->「オプション」を選択

左のウィンドウの「テキストエディター」->「C/C++」->「書式設定」->「改行」を選択

右のウィンドウの「始めかっこの位置」->「コントロールブロックのはじめかっこの位置」->「同じ行に残し、その前にスペースを1つ追加」を選択

OKボタンを押して、オプションウィンドウを閉じる。

 

そうすると、このように、コントロールブロックの始まりの中括弧 { が同一行に表示されます。


Tip_04_01_003b

 

デフォルトでは、このように、コントロールブロックの始まりの中括弧 { が、改行された状態になっています。


Tip_04_01_003a

 

どっちがメジャー派なんですかね。

 

標準ライブラリ関数 gets が使えない

 

Visual Studio 2015では、標準ライブラリ関数 gets が使えなくなりました。

 

確認環境:Visual Studio Community 2015

 

Visual Studio Community 2015で、標準ライブラリ関数 gets をソースコードに書いていたら、

「識別子 “gets” が定義されていません」

と、エラー一覧ウィンドウに表示されました。

 

Microsoft Developer Network で、Visual Studio 2015から、「 gets」はライブラリから削除されたと書いてありました。

 

「 gets」の変わりに「 gets_s」を使いましょう。

「 gets_s」は、「gets」のセキュリティ強化版です。

 

類似の現象で、「scanf」、「strcat」、「strcpy」もエラーになります。

これらはコンパイル時点でエラーになります。

「scanf」の変わりに「scanf_s」を使いましょう。

「strcat」の変わりに「strcat_s」を使いましょう。

「strcpy」の変わりに「strcpy_s」を使いましょう。

 

#ifdef #ifndef

 

C言語の #ifdef と #ifndef の使い方についてまとめました。

 

確認環境:Eclipse 4.5.2

 

ソースコード見たほうが早いですね。

実行結果です。

Tip_04_01_001a

 

解説:

#ifdef 【宣言名】

#endif

がひとつのかたまりです。

【宣言名】が #define で定義されていれば、このかたまりは実行されます。

 

これとは逆に、

#ifndef 【宣言名】

#endif

【宣言名】が #define で定義されていなければ、このかたまりは実行されます。

 

このように、ある時は実行させたいけれど、ある時は実行させたくないという箇所を、

#ifdef ~ #endif、#ifndef ~ #endif でくくっておけば、

#define の定義を切り替えるだけで、実行したり、実行しなかったりを変えることができ、

コメントアウトやコメントインよりも柔軟な対応ができるので、特にデバッグの時に便利です。

 

なお、#ifdef、#ifndef、#endif、#include などの 「#」がつくものを ディレクティブ と言います。