Arduinoは何言語?C言語・C++との違いを初心者向けに解説

プログラミング・電子工作






Arduinoは何言語?C言語・C++との違いを初心者向けに解説







基礎知識 / 言語

Arduinoは何言語?C言語・C++との違いを初心者向けに徹底解説

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

YOFUKASI LAB編集部
公開日:2026年8月27日
読了目安:15分

執筆・実機検証:YOFUKASI LAB運営者

理学療法士/Arduino・Pythonを使った医療機器制作・学会発表経験あり

Chapter 01 / Conclusion

01結論:「Arduino言語」という独立した言語は存在しない

ArduinoはC++をベースにした開発環境であることを示す図解

正体は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++の学習が、実はもっとも近道だったと気づいたのだ。土台となる言語を知ることは、応用力につながります。



Chapter 02 / Relationship

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++の上に構築された「開発環境・フレームワーク」というのが正確な表現です。

Chapter 03 / Behind the Scenes

03スケッチ(.inoファイル)の裏側で起きていること

ArduinoのinoファイルがC++としてコンパイルされる流れの図解

プリプロセス処理で行われる4つのこと

Arduino IDEで書いたコードには、名前があります。拡張子.inoのファイルで、「スケッチ」と呼びます。このスケッチは、書き込みボタンを押した瞬間に変換されます。いくつかの処理を経ているのです。Arduino公式のプリプロセッサ資料によると、主に次の4つの処理が行われます。

  1. 複数の.inoファイルがある場合、それらを1つのファイルにまとめる
  2. ファイルの先頭に#include <Arduino.h>を自動で追加する
  3. 使用しているライブラリを検出し、必要な参照先を解決する
  4. コードの中から関数を見つけ出し、足りない関数プロトタイプ(宣言)を自動的に補う

この処理が終わると、スケッチは生まれ変わります。正式な「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が何を省略してくれているのかが、はっきり見えてきます。



Chapter 04 / Simplifications

04Arduinoが簡略化してくれているポイント

関数プロトタイプの自動生成

C言語やC++には、細かいルールがあります。ある関数を、定義した場所より前で呼び出す場合があります。その際は、あらかじめ宣言(プロトタイプ)を書いておく必要があるのです。「こういう関数がありますよ」という宣言です。しかし、Arduinoのスケッチでは事情が違います。この宣言を省略しても動くことがほとんどです。理由は簡単です。3章で説明したプリプロセス処理があります。これが、自動的に宣言を補ってくれているからです。

setup/loopという枠組み

C++の世界には、決まりがあります。プログラムの入り口も出口も、すべて自分でmain()の中に書く必要があるのです。Arduinoは、この面倒な部分を工夫しました。2つのわかりやすい箱に分けてくれたのです。「1回だけ実行する部分(setup)」と「繰り返し実行する部分(loop)」です。電子工作でやりたいことの多くは、この2つの箱に収まるように設計されています。

ライブラリという名の「あらかじめ用意された部品」

もう1つの大きな簡略化が、ライブラリです。モーターを制御するにも、本来は準備が必要です。レジスタと呼ばれる低レベルな設定を、自分で細かく行う必要があります。しかし、Servoライブラリを使えば話は別です。myServo.write(90);のようなシンプルな命令だけで済みます。これは、C++のクラスという仕組みを使っています。複雑な処理を「部品」としてパッケージ化したものです。

編集部見解

Arduinoの便利さの正体は、新しい言語を発明したことではありません。実績のある言語の上に、親切な仕組みを積み重ねたことにあります。「C++という土台に、電子工作向けの工夫を重ねた」というイメージです。この理解があると、エラーメッセージの読み方が変わってきます。ライブラリの中身を覗く力も、大きく変わってきます。

Chapter 05 / C-style vs C++-style

05C言語風の書き方とC++風の書き方を比較する

ArduinoにおけるC言語風と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の記事にもコードが登場しました。これらも、同じ考え方で書かれています。



Chapter 06 / Common Misunderstandings

06初心者が誤解しやすいポイント

Stringクラスの注意点

!

ArduinoのStringは、C++標準のstd::stringとは別物

ArduinoにはStringというクラスがあります。とても便利です。文字列の結合などが簡単に書けます。しかし、注意点があります。これはArduino独自に用意されたクラスなのです。パソコン向けのC++には、標準ライブラリがあります。よく使われるstd::stringとは、異なるものです。また、Stringクラスには特徴があります。内部でメモリを動的に確保する仕組みを使っているのです。使い方によっては、メモリの断片化を招くことがあります。特にメモリの少ないボードでは注意が必要です。char配列(C言語スタイルの文字列)を使う方が安全な場面もあります。

高度なC++機能は使えないことがある

!

すべてのC++機能が使えるわけではない

Arduinoの正体はC++です。ただし、事情があります。動作するマイコンのメモリは、パソコンに比べてごくわずかです。そのため、制約もあります。例外処理や一部の高度なテンプレート機能があります。これらC++の機能の中には、Arduino環境では使いにくいものもあります。あるいは、非推奨とされているものもあります。基本的な文法・クラス・オブジェクトの仕組みは問題なく使えます。必要以上に心配する必要はありません。



Chapter 07 / How to Learn

07学習の進め方|何から手をつければいいか

C言語の基本文法から始めるのが近道

ここまでの内容を踏まえると、学習の進め方が見えてきます。まずは、C言語の基本文法に慣れることをおすすめします。変数・if文・for文・配列・関数といった要素です。理由があります。これらは、そのままArduinoでも通用する知識だからです。実際に手を動かしながら覚えるのが、もっとも定着しやすい方法です。

クラスという考え方は、あとから理解しても遅くない

クラスやオブジェクトという概念があります。いかにもC++らしい概念です。しかし、最初から完璧に理解する必要はありません。Servo myServo;のような書き方があります。これを「おまじない」として使う方法もあります。使いながら、少しずつライブラリの中身に興味を持っていく。そんな進め方でも十分です。当サイトのロードマップ記事も参考になります。基礎から応用まで段階を踏んで学ぶ流れを紹介しています。あわせて参考にしてください。

Chapter 08 / FAQ

08よくある質問

基本のQ&A

Q.「Arduino言語」という独自の言語を勉強する必要はありますか?
A.その必要はありません。Arduinoで書くコードの正体はC++です。C++の基本文法(変数、if文、for文、関数、配列など)を学べば、そのままArduinoのコードを読み書きできます。「Arduino言語」は、C++にごく薄い便利機能を足したものだと考えてください。

Q.C言語の入門書で勉強した知識は、Arduinoに活かせますか?
A.十分に活かせます。C言語の基本文法(if文、for文、変数、配列、構造体、関数など)は、ほぼそのままArduinoでも通用します。C++はC言語を土台にして拡張された言語だからです。C言語を先に学んでおくことは、遠回りではなく良い土台になります。

応用のQ&A

Q.setup()やloop()を自分でmain()から呼び出す必要はないのですか?

Arduinoのsetup関数とloop関数の役割と実行順序の図解

A.必要ありません。Arduinoのコードをコンパイルする際、裏側でmain()関数が自動的に生成されます。このmain()の中で、setup()を1回だけ、loop()を無限に繰り返し呼び出す処理が、あらかじめ書き込まれています。これがArduinoでmain()を書かなくてよい理由です。

Q.ArduinoでC++のクラスを自分で作ることはできますか?
A.できます。ServoやSDなど、Arduino公式ライブラリの多くはクラスとして作られています。同じように、自分でクラスを定義してオブジェクトを作ることも可能です。センサーの値をまとめて管理するクラスを自作する、といった応用ができます。

関連記事・参考資料

基礎を学べる記事

  1. YOFUKASI LAB「Arduinoのコード・プログラムの書き方(コピペ可20選)」2026年, https://yofukasi-lab-wp.com/2026/07/18/arduino-cord/
  2. YOFUKASI LAB「Arduinoのsetup()とloop()とは?」2026年, https://yofukasi-lab-wp.com/2026/07/30/arduino-setup-loop/
  3. YOFUKASI LAB「Arduinoの関数の作り方・使い方」2026年, https://yofukasi-lab-wp.com/2026/08/18/関数/

応用・関連記事

  1. YOFUKASI LAB「Arduinoでサーボモーターを制御する方法」2026年, https://yofukasi-lab-wp.com/2026/08/18/servo/
  2. YOFUKASI LAB「Arduinoの変数の型(int・float・String)の使い分け」2026年, https://yofukasi-lab-wp.com/2026/08/17/int-float-string/

参考資料(外部・一次情報)

  1. Arduino GitHub「arduino-preprocessor:Arduino Sketch preprocessor」, https://github.com/arduino/arduino-preprocessor
  2. Circuitrocks Learn「Arduino Sketch Build Process: From .ino to Flash Memory」, https://learn.circuit.rocks/exploring-the-arduino-sketch-build-process

※本記事は個人の学習用途を対象にしています。プロダクト開発など、より厳密な仕様確認が必要な場合は、Arduino公式ドキュメントもあわせてご確認ください。


関連記事

特集記事

コメント

この記事へのコメントはありません。

TOP
CLOSE