ここから本文です

Arduino初心者です.arduinoのライブラリはcppファイルとhファイルでできているよ...

jag********さん

2018/10/1215:05:28

Arduino初心者です.arduinoのライブラリはcppファイルとhファイルでできているようですが,cppの代わりにcファイルではダメなのでしょうか.

閲覧数:
40
回答数:
1

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

qui********さん

2018/10/1309:03:16

とりあえず試してみました。
librarysディレクトリに
testClibディレクトリを掘って、
まずは、C++でのコンパイルしていることを検出できるか試行
---testClib.h
int func(void);
---
---testClib.cpp
#include "testClib.h"
int func(void){
int n=4;
char array[n];//C++ではエラーになるはず(1)
int* p;
array[0]=0;
array[1]=1;
array[2]=2;
array[3]=3;
p=array;//C++ではエラーになるはず(2)
return *p;
}
---
で、スケッチは
---
#include <testClib.h>
void setup() {
int a=func();
}
void loop() {
}
---
コンパイルすると
(1)の可変長配列の方はgccの拡張ということで処理されちゃったみたいですが、
(2)のポインタの型検査については
testClib.c:10:3: error: cannot convert 'char [n]' to 'int*' in assignment

p=array;
でちゃんとエラーになります。つまり、もしC++として処理されるとエラーが出るのでわかるということです。

つぎに、testClib.cppをtestClib.cにリネームして再度コンパイルすると、先程のエラーの部分は
testClib.c:10:3: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]

p=array;
で警告に格下げ(?)になったので、今度はCとして処理されていることが確認できました。
さらにその後リンク時に、
sketch_oct13a/sketch_oct13a.ino:5: undefined reference to `func()'
ということでエラーが出ますが、これも予想の範囲内で、C++のプログラムでCのライブラリを取り込む時の定番通りに
---testClib.h
#ifdef __cplusplus
extern "C"{
#endif /*__cplusplus */
int func(void);
#ifdef __cplusplus
}
#endif /*__cplusplus */
---
とすればコンパイル/リンクが無事完了しました。この辺については'extern "C" __cplusplus'あたりで検索すれば情報は見つかるはずです。


結局、C言語記述のライブラリについては、ライブラリのヘッダ内での宣言を
#ifdef __cplusplus
extern "C"{
#endif /*__cplusplus */

諸々宣言

#ifdef __cplusplus
}
#endif /*__cplusplus */
で囲ってやればよさそうです。
あるいは、何らかの事情でライブラリ側のファイルをいじりたくなければ、スケッチの側で
extern "C" {
#include <lib.h>//C用のヘッダファイル
}
等としてやってもいいでしょうけど。

この質問は投票によってベストアンサーに選ばれました!

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる