Arduinoは何言語?C言語・C++との違いを初心者向けに徹底解説
「Arduino言語」という特別な言語がある、と思い込んでいませんか。実はそうではありません。Arduinoで書くコードの正体は、C++という広く使われている言語です。本記事では、Arduino・C言語・C++の関係を整理します。豊富な具体例とともに解説します。裏側で何が起きているのかまで、初心者の方にもわかりやすく紹介します。
01結論:「Arduino言語」という独立した言語は存在しない

正体はC++(正確にはC言語も混ざったC++)
先に結論をお伝えします。Arduinoで書くコードは、独自の新しい言語ではありません。正体は「C++」という言語です。より正確に言うと、事情は少し違います。C言語の書き方とC++の書き方を、どちらも使える環境になっています。理由があります。C++は、もともとC言語をベースにして作られた言語だからです。C言語のコードの多くは、そのままC++としても通用します。
なぜ「Arduino言語」と呼ばれるのか
それでも「Arduino言語」という呼び方を見かけることがあります。理由は明快です。Arduinoが独自の便利な仕組みを用意しているためです。digitalWrite()やanalogRead()のような、見慣れた関数群があります。setup()とloop()という独特な構造もあります。
文法ではなく道具箱が違う
これらは、C++の文法の中に用意された道具箱のようなものです。いわば「Arduino専用の道具箱」です。文法自体が変わっているわけではありません。道具箱の中身が、電子工作向けに特化しているだけなのです。
プログラミング初心者のKさんは、Arduinoを始める前に「Arduino語」という専用の教科書を探していた。しかし、見つかったのはC++の入門書ばかりだった。不思議に思って調べてみた。すると、Arduinoの中身がC++だと知った。遠回りに感じたC++の学習が、実はもっとも近道だったと気づいたのだ。土台となる言語を知ることは、応用力につながります。
02C言語・C++・Arduinoの関係を整理する
C言語とは何か
C言語は、1970年代に開発された、非常に歴史のある言語です。変数、if文、for文、関数、配列、構造体といった基本要素を持っています。処理の手順を順番に書いていく「手続き型」という考え方が中心です。今でも、OSや組み込み機器の開発など、幅広い場面で使われ続けています。
C++とは何か
C++は、C言語をベースにして、新しい機能を追加した言語です。もっとも大きな追加要素があります。「クラス」と「オブジェクト」という仕組みです。これを使うと、データとそれを操作する処理を1つにまとめて扱えます。この考え方を「オブジェクト指向プログラミング」と呼びます。C言語でできることは、ほぼそのままC++でもできます。加えて、より高度な整理の仕方ができるようになった、とイメージしてください。
Arduinoは「C++に便利機能を足した環境」
Arduinoは、このC++を土台にしています。そこに、電子工作をやりやすくするための工夫を加えた環境です。次の章で詳しく説明します。Arduinoは裏側でC++のコードに自動変換されてからコンパイルされるのです。関係性を図にすると、次のようになります。
| 言語・環境 | ひとことで言うと | Arduinoとの関係 |
|---|---|---|
| C言語 | 手続き型の伝統的な言語 | C++の土台になっている。書き方の多くがそのまま通用する |
| C++ | Cを拡張し、クラスを追加した言語 | Arduinoの正体そのもの |
| Arduino | C++に電子工作向けの便利機能を足した環境 | 本記事のテーマ |
※Arduinoは新しい「言語」ではなく、C++の上に構築された「開発環境・フレームワーク」というのが正確な表現です。
03スケッチ(.inoファイル)の裏側で起きていること

プリプロセス処理で行われる4つのこと
Arduino IDEで書いたコードには、名前があります。拡張子.inoのファイルで、「スケッチ」と呼びます。このスケッチは、書き込みボタンを押した瞬間に変換されます。いくつかの処理を経ているのです。Arduino公式のプリプロセッサ資料によると、主に次の4つの処理が行われます。
- 複数の.inoファイルがある場合、それらを1つのファイルにまとめる
- ファイルの先頭に
#include <Arduino.h>を自動で追加する - 使用しているライブラリを検出し、必要な参照先を解決する
- コードの中から関数を見つけ出し、足りない関数プロトタイプ(宣言)を自動的に補う
この処理が終わると、スケッチは生まれ変わります。正式な「C++のソースコード」になるのです。そこから先は、C++を扱う一般的なコンパイラ(avr-gcc)が担当します。機械語への変換を行います。
隠されたmain()関数の正体
ここが、もっとも重要なポイントです。通常のC++プログラムには、決まりがあります。必ずmain()という関数が必要なのです。プログラムは、このmain()から実行が始まる決まりになっているからです。しかし、Arduinoのスケッチには、main()を書いた記憶がないはずです。実は、裏で助けが入っています。Arduinoのコア(内部ライブラリ)が、あらかじめmain()を用意してくれているのです。この隠れたmain()の中身は、およそ次のような内容です。
// Arduinoが裏側で自動的に用意しているmain()のイメージ
int main(void) {
setup(); // 電源投入時に1回だけ呼ばれる
while (true) {
loop(); // delayを挟みながら、ずっと繰り返し呼ばれる
}
return 0;
}
つまり、こういうことです。setup()とloop()という見慣れた2つの関数があります。これらは、この隠れたmain()から呼び出されているだけなのです。C++の基本ルールがあります。それを、Arduinoが親切に肩代わりしてくれているというわけです。
例:素のC++で同じコードを書くとどうなるか
普段よく書くLED点滅のコードで考えてみましょう。Arduinoの助けを借りずに、素のC++で書くとどうなるでしょうか。イメージだけ比較してみます。
// 【Arduinoでの書き方】
// setup()とloop()を書くだけでよい
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
// 【もしmain()を自分で書くとしたら、というイメージ】
// Arduinoが普段隠してくれている部分がむき出しになる
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
int main(void) {
setup();
while (true) {
loop();
}
return 0;
}
2つを見比べてみましょう。Arduinoが何を省略してくれているのかが、はっきり見えてきます。
04Arduinoが簡略化してくれているポイント
関数プロトタイプの自動生成
C言語やC++には、細かいルールがあります。ある関数を、定義した場所より前で呼び出す場合があります。その際は、あらかじめ宣言(プロトタイプ)を書いておく必要があるのです。「こういう関数がありますよ」という宣言です。しかし、Arduinoのスケッチでは事情が違います。この宣言を省略しても動くことがほとんどです。理由は簡単です。3章で説明したプリプロセス処理があります。これが、自動的に宣言を補ってくれているからです。
setup/loopという枠組み
C++の世界には、決まりがあります。プログラムの入り口も出口も、すべて自分でmain()の中に書く必要があるのです。Arduinoは、この面倒な部分を工夫しました。2つのわかりやすい箱に分けてくれたのです。「1回だけ実行する部分(setup)」と「繰り返し実行する部分(loop)」です。電子工作でやりたいことの多くは、この2つの箱に収まるように設計されています。
ライブラリという名の「あらかじめ用意された部品」
もう1つの大きな簡略化が、ライブラリです。モーターを制御するにも、本来は準備が必要です。レジスタと呼ばれる低レベルな設定を、自分で細かく行う必要があります。しかし、Servoライブラリを使えば話は別です。myServo.write(90);のようなシンプルな命令だけで済みます。これは、C++のクラスという仕組みを使っています。複雑な処理を「部品」としてパッケージ化したものです。
Arduinoの便利さの正体は、新しい言語を発明したことではありません。実績のある言語の上に、親切な仕組みを積み重ねたことにあります。「C++という土台に、電子工作向けの工夫を重ねた」というイメージです。この理解があると、エラーメッセージの読み方が変わってきます。ライブラリの中身を覗く力も、大きく変わってきます。
05C言語風の書き方とC++風の書き方を比較する

C言語風:構造体と関数でセンサー値を管理する
Arduinoでは、C言語風の書き方も、C++風の書き方も、どちらも使えます。まずは、C言語でおなじみの書き方を見てみましょう。「構造体」と「関数」を使います。2つのセンサー値をまとめて扱う例です。
// C言語風の書き方:構造体でデータをまとめる
struct SensorData {
int temperature;
int humidity;
};
// 構造体を受け取って表示する関数
void printSensorData(SensorData data) {
Serial.print("温度: ");
Serial.print(data.temperature);
Serial.print(" 湿度: ");
Serial.println(data.humidity);
}
void setup() {
Serial.begin(9600);
SensorData myData;
myData.temperature = 25;
myData.humidity = 60;
printSensorData(myData);
}
void loop() {
}
C++風:クラスとオブジェクトでモーターを管理する
次は、C++らしい書き方です。「クラス」を使った例を見てみましょう。データ(角度)があります。それを操作する処理(回転させる関数)があります。この2つを1つにまとめています。
// C++風の書き方:クラスでデータと処理をまとめる
class SimpleMotor {
private:
int currentAngle; // クラスの中でだけ扱うデータ
public:
// コンストラクタ(オブジェクトを作るときに呼ばれる)
SimpleMotor() {
currentAngle = 0;
}
// 角度を設定する処理
void setAngle(int angle) {
currentAngle = angle;
Serial.print("モーターの角度を");
Serial.print(angle);
Serial.println("度に設定しました");
}
// 現在の角度を取得する処理
int getAngle() {
return currentAngle;
}
};
SimpleMotor myMotor; // クラスからオブジェクトを作る
void setup() {
Serial.begin(9600);
myMotor.setAngle(90); // オブジェクトの機能を呼び出す
}
void loop() {
}
Arduino公式ライブラリはクラスの塊
実は、見慣れた書き方があります。Servo myServo;やMFRC522 rfid(SS_PIN, RST_PIN);のような書き方です。これは、まさにクラスとオブジェクトの仕組みです。Servoというクラスがあらかじめ用意されています。そこからmyServoというオブジェクト(実体)を作っているのです。RFIDセンサーの記事や、MPU6050の記事にもコードが登場しました。これらも、同じ考え方で書かれています。
06初心者が誤解しやすいポイント
Stringクラスの注意点
ArduinoのStringは、C++標準のstd::stringとは別物
ArduinoにはStringというクラスがあります。とても便利です。文字列の結合などが簡単に書けます。しかし、注意点があります。これはArduino独自に用意されたクラスなのです。パソコン向けのC++には、標準ライブラリがあります。よく使われるstd::stringとは、異なるものです。また、Stringクラスには特徴があります。内部でメモリを動的に確保する仕組みを使っているのです。使い方によっては、メモリの断片化を招くことがあります。特にメモリの少ないボードでは注意が必要です。char配列(C言語スタイルの文字列)を使う方が安全な場面もあります。
高度なC++機能は使えないことがある
すべてのC++機能が使えるわけではない
Arduinoの正体はC++です。ただし、事情があります。動作するマイコンのメモリは、パソコンに比べてごくわずかです。そのため、制約もあります。例外処理や一部の高度なテンプレート機能があります。これらC++の機能の中には、Arduino環境では使いにくいものもあります。あるいは、非推奨とされているものもあります。基本的な文法・クラス・オブジェクトの仕組みは問題なく使えます。必要以上に心配する必要はありません。
07学習の進め方|何から手をつければいいか
C言語の基本文法から始めるのが近道
ここまでの内容を踏まえると、学習の進め方が見えてきます。まずは、C言語の基本文法に慣れることをおすすめします。変数・if文・for文・配列・関数といった要素です。理由があります。これらは、そのままArduinoでも通用する知識だからです。実際に手を動かしながら覚えるのが、もっとも定着しやすい方法です。
クラスという考え方は、あとから理解しても遅くない
クラスやオブジェクトという概念があります。いかにもC++らしい概念です。しかし、最初から完璧に理解する必要はありません。Servo myServo;のような書き方があります。これを「おまじない」として使う方法もあります。使いながら、少しずつライブラリの中身に興味を持っていく。そんな進め方でも十分です。当サイトのロードマップ記事も参考になります。基礎から応用まで段階を踏んで学ぶ流れを紹介しています。あわせて参考にしてください。
08よくある質問
基本のQ&A
応用のQ&A

関連記事・参考資料
基礎を学べる記事
- YOFUKASI LAB「Arduinoのコード・プログラムの書き方(コピペ可20選)」2026年, https://yofukasi-lab-wp.com/2026/07/18/arduino-cord/
- YOFUKASI LAB「Arduinoのsetup()とloop()とは?」2026年, https://yofukasi-lab-wp.com/2026/07/30/arduino-setup-loop/
- YOFUKASI LAB「Arduinoの関数の作り方・使い方」2026年, https://yofukasi-lab-wp.com/2026/08/18/関数/
応用・関連記事
- YOFUKASI LAB「Arduinoでサーボモーターを制御する方法」2026年, https://yofukasi-lab-wp.com/2026/08/18/servo/
- YOFUKASI LAB「Arduinoの変数の型(int・float・String)の使い分け」2026年, https://yofukasi-lab-wp.com/2026/08/17/int-float-string/
参考資料(外部・一次情報)
- Arduino GitHub「arduino-preprocessor:Arduino Sketch preprocessor」, https://github.com/arduino/arduino-preprocessor
- Circuitrocks Learn「Arduino Sketch Build Process: From .ino to Flash Memory」, https://learn.circuit.rocks/exploring-the-arduino-sketch-build-process
※本記事は個人の学習用途を対象にしています。プロダクト開発など、より厳密な仕様確認が必要な場合は、Arduino公式ドキュメントもあわせてご確認ください。
コメント