上のコードもどちらの動作が正しいかはC言語の仕様上決められていないので、この意味でもこういったコードは避けるべきです。 定数って使ってますか? C言語で定数というと「#define」を使って定義するイメージが強いですよね。でも、const修飾子を使うとひとつの関数内のみで定数を扱う場合などに便利です。 この記事では、constについて constとは constの使い方 constを使う上での注意点について タイトルに「組み込みC言語の〜」なんて書きましたが、結論は組み込みに限らず最新のC言語での結論と同じになってしまいました。.

define関数とconst構文は両方とも定数を定義するものになります。そんなdefine関数とconst構文の違いは以下のようになります。, define:グローバル関数→プログラム内のどこからでも呼び出せるconst:ローカル関数→宣言したクラス内のみで使える, もちろん両方とも定数を定義しているので、一度定義した値は書き換えることができません。, string $name:定数名 文字列のみmixed $value:定数の値 integer, float, string, boolean, NULLが入る(PHP7では配列を使える)$case_insensitive:faleseの時は定数の大文字、小文字を区別する。TRUEの時は定数の大文字、小文字を区別しない。, defineは関数ですが、constは関数ではありません。そのため、constの方が処理される速度が速いです。もし、大量に定数を定義する場合はconstを使う方が良いでしょう。, IT関連の情報と世界中の美味しい食べ物や美しい場所を紹介するアウトプットブログです. 自分は基本C言語系ではconstです。, #defineはコンパイルの初期段階でコピペや置換されると考えてください C/C++言語では、#defineの他にconstが定数として使えるようになりましたが、今後どちらに統一するか悩んでいます。constにする利点、欠点や#defineにする利点や欠点など、コーデイングのプロにお聞きしたいです。#define は単に値を定義 まず用語として,「定数」はCの規格では特定の意味があるのでした.具体的には,JIS X 3010:2003では,定数は「整数定数」「浮動小数点定数」「列挙定数」「文字定数」のいずれかとしています.なので,上のコードのどちらであっても,ledPinを定数とみなすのは,規格から外れた解釈となります. まあそれはそれとして,constか#defineかについては,英語の議論を見つけました., この中で,Jonathan Leffler (answered Nov 4 '09 at 15:17)の意見が秀逸でした.. #define と、const では、コンパイラーの内部で処理している事が全く違います。したがって、その用途も全く違います。 (1)#define は、C言語等のコンパイラーに組込まれた「プリプロセッサー」というコマンドの1つです。 もう少し,調べてみました.Sketchのチュートリアル(http://arduino.cc/en/Tutorial/Sketch)には,「int ledPin = 13;」と書かれていました.その一方で,wikipedia:Arduinoおよびwikipedia:en:Arduinoでは,サンプルコードの中に「#define LED_PIN 13」とあります.Webにおいても,どちらでもよさそうです., ArduinoやSketchから離れて,C言語として,定義の仕方を調べてみました.

メールが来ました.学内の先生からです.アルドゥイーノのスケッチのプログラミングで,定数を定義するのに,ある本ではconst intを使っており,また別の本では#defineを使っているのだけれど,夏休みのプログラミング教室で教える際には,どちらのほうが良いのか,とのこと.……, の違い,というわけですが,一般論としては,const intで書く方が,“Cらしい”と言っていいでしょう. (1)は関数スコープの静的配列の次元として使うことができない.(2)と(3)ならできる., C99では,これらのいずれもローカルな配列(の次元)として使うことができる.技術的には,(1)を使うと可変長配列になるが,その次元はvarにより5に固定される., (1)はswitch文なんかの定数として使うことができない.(2)と(3)ならできる., (2)は,前処理の段階で望まないコードの変更ができてしまう.(1)と(3)ではそのような期待されない副作用は起こらない., (2)では前処理の段階で値の設定がなされることを検出できる.(1)と(3)ではできない.. (2) can change code that you didn't want changed because it is used by the preprocessor; both (1) and (3) will not have unexpected side-effects like that. You (and everyone else so far) omitted the third alternative: Ignoring issues about the choice of name, then: So, in most contexts, prefer the 'enum' over the alternatives. 特に大きく気にするところではありませんが、 All rights reserved. C言語の組み込みプログラミングを3ヶ月でマスターし、組み込みマイコンのプログラマーを目指すためのブログ, 組み込みマイコンのプログラムでは、入出力の処理を行うのが肝になるため、この入出力の名前をつけるのに列挙型を使用します。, 例えば、犬や猫などの動物に対して、dogは0、catは1というふうに割り当てたいときに、列挙型を用いると便利です。, 組み込みマイコンでは、エレベータで例を挙げると、入力や出力、走行フェーズやドアの動作フェーズなどに対して、列挙型をしようしています。, 構造体ではenumのところがstructとなり、列挙子の部分がメンバ変数宣言になります。, タグ名はなくても構いません。列挙子は何も指定しなければ、0から順番に割り当てられます。, 停止中、起動準備、走行中、減速中という感じですね。実際にはいろんな制御があるため、もっと複雑です。, 減速中のあとは、停止中に戻るので、この4つで、エレベータの走行の状態を表すことができます。, それらを用いて、いろんな状態監視をしています。ここでは、そのお話はしないことにします。, 列挙型に話を戻しますが、stop は 0、start は 1、run は 2、dclr は 3 ということになります。, 列挙型は、列挙子に何も指定しなければ、0から順番に割り当てられるとお話ししました。, startを10に割り付けました。何も指定しないときは、1になりますが、このように10にすることができます。, そして、start を 10 にしたことで、以降のrun は 11、dclr は 12 となります。ちなみに、stopは 9 にはならず、0 のままです。, 組み込みマイコンでは、入力の空きポートがあった場合に、そこには何も割り当てたくないので、わざとダミー列挙子を書くか、数値を割り当てなおすことで対応します。, しかし、enumを使わないと、stop, start, run, dclrが相互に関連しているという意図が伝わりにくくなるでしょう。, 列挙型enumについて、お話ししました。関連性のある固定データは、enumを使って、まとめておく方がよいと思います。, そのほうが、さらに追加で関連データが増えても、意識しなくても、+1された値になりますから、意図しない数値にはなりません。, 始めのうちは、あなたの思うようにプログラムを書いてみるといいでしょう。そうしているうちに、どう書くのが最善かを考えるようになってきます。そのときにenumがあったなと思い出せれば、それでよいと思います。, なかなか、ソフトウェアの技術者が入ってこないのと、育つまでに時間がかかるので、一人一人にかかる負荷が非常に大きいです。, 私自身もプログラミング技術を身につけ、仕事に貢献できるようになるまで、3年はかかりました。, しかし、今では日々皆さんが利用しているエレベータのプログラムを最前線で作成しています。. 追記: 使い分けの所を見落としてました。 特に大きく気にするところではありませんが、 constの方がC言語っぽい感じがします。 極端なことを言えばプログラムを停止させるコンパイラがあっても、それは仕様上構わないのです。

Otherwise, the first and last bullet points are likely to be the controlling factors - and you have to think harder if you need to satisfy both at once.