投稿

ラベル(iOSアプリ開発(C言語))が付いた投稿を表示しています

No Common Blocks - Xcode 8から起こりがちなリンクエラー

Build SettingにあるNo Common BlocksというものがXcode 8からデフォルトでOnの模様。古いプロジェクトを初めてXcode 8で開くときに出てくる、コンパイラ設定変更の警告に従うとOnにされる。 これがOnだとObjective-Cのプロジェクトで、例えば あるヘッダーでグローバル変数を定義している(例 : int a; ) そのヘッダーが2箇所以上から#importされる の条件でリンクエラーを起こします。 externで回避しました。 ヘッダー側はextern int a; 実装側でint a; externの説明は他を参照して下さい。 検索用 Xcode 8 No Common Blocks Apple Mach-O Linker Error Linker command failed with exit code 1 (use -v to see invocation) Message from debugger: Terminated due to signal 15

const char *argv[]

iOSプログラミングでmain関数ってあまりじっくり見る機会がないんだけどよく見ると const char *argv[] っていう引数が結構難解。 文法通りの結果になるような私なりの解釈を書いてみる。これは人によって違いがあると思う。 まずchar *argv[]の解釈だが、そのまえにポインタと配列の宣言の分析をする。 int *abc; これは、*をつけてアクセスしたものはint型(つまりintへのポインタ)で、名前はabcというものを宣言。 int abc[]; これは各要素はintである配列で、名前はabcというものを宣言。 これをふまえてchar *argv[]を考えると *よりも[]のほうが優先順位が高いのでこの順番で解釈し、 ある配列がある。その各要素は*をつけてアクセスするとcharになるもで、その名前(配列の名前)はargv。と解釈し、argv[]はchar型へのポインタの配列で、argvと配列名だけで使用するとその先頭要素を指す。配列の要素のargv[0]はchar型へのポインタ。 また優先順位を意図的に変えたchar (*argv)[]だと、こちらのページが詳しく書いてある。 今こそ再考察! C言語ポインタ徹底解説 「配列へのポインタ」と「2次元配列(配列の配列)」の関係 http://news.mynavi.jp/articles/2008/04/18/pointer/003.html 4ページあるうちの4ページ目です。1ページ目から内容が良いので読むことをおすすめします。 この(*argv)の部分だが「配列の名前が先頭要素へのポインタだから、さらにそれを指すポインタ」と解釈したら間違いらしい。argvはポインタだが指す先は配列の先頭要素。だとすると、*をつけたときとつけないときで何が違うか、というのを疑問に思うが、それも上のページに詳しく書いてある。*をつけるとポインタ加算命令に対して配列ひとつ分進むらしい。なので宣言時に配列の要素数は必須。上のchar (*argv)[]はXcodeのコンパイラだとポインタ演算のところでエラー。 ちなみに配列の名前はポインタと近いが微妙な違いがある。 char *argv[]の間違った解釈としては char型の配列があってその先頭要素を指すポインタをさらに指...