Tag: コンパイルエラー

エラーメッセージ定义を掘り下げる

ここではSwiftのコンパイルエラーのメッセージ定义を改めて掘り下げる。 defッセージ定义は.defファイルの中でこのような形で书かれている。 错误(extra_rbrace,none, “顶级的外部’}’”,() ERRORの他にWARNING AR NOTEもあるが形は同じである。 そ利用方法に応じて様々な形に変えられる。その変换处理は#define机能を使って非常に复雑に(どこが走っているかわかりにくい状态で)行われる。 .defファイルには,それぞれ対応する.hファイルがあり,まずはそのペアのつながりで.defファイルがどう利用されるかを见ていく。 .defファイルと.hファイルのペアというの例,例えば DiagnosticsParse.def に対して DiagnosticsParse.h があるということ。 .defファイルの中身は #ifndef错误 #定义ERROR(ID,Options,Text,Signature)\ 诊断(错误,ID,选项,文本,签名) #endifそれぞれのメッセージ定义が大量#ifndef DIAG_NO_UNDEF #如果已定义(DIAG) #undef DIAG # 万一 #undef错误 #万一 となっている。ポイントを挙げると ファイルの头で, ERRORがすでに#defineされているかどうかを确认し,されていない场合には#defineを行い, ERRORをDIAGに置き换える设定をする(引数の表记は省略)。 一个々のメッセージ定义の后,最后にDIAG_NO_UNDEFの状态によりdefine状态の消去を行う。 ちなみに, WARNINGとNOTEが构造がERRORと同じなので省いてある,ここから先も同じ。 h .hファイルの中身は #include“ swift / AST / DiagnosticsCommon.h”#定义DIAG(KIND,ID,Options,Text,Signature)\ 外部详细信息:: DiagWithArguments ::类型ID; #include“ DiagnosticsParse.def” DIAGが#defineされて, extern detail::DiagWithArguments::type ID; になる。 defの后で.defファイルが#includeされる。 h,この.hファイルを読み込んだ场合は, ERROR […]

斯威夫特のコンパイルエラーの仕组み

そンパイルエラーが出たときに原因を(りたンパイラのソース分析的に)探りたいときがある。その水深1cmまでをまとめてみたい。 これを読む阳离子(水深0.1cm) 手元にSwiftのコードがあること。下の场所から入手できる。私は下载Zip bonタンロードした。 苹果/斯威夫特 swift – Swift编程语言 github.com エラーメッセージのありか(水深0.3cm) 普段,プログラミンミ中に目にするエラーメッセージの文章は / include / swift / AST の中にある 诊断***。def という,拡张子がdefのファイルにまとめて书かれている。このファイルは复数あって,***には化化された名前が入る。 以下のものがある。 DiagnosticsParse.def DiagnosticsSema.def DiagnosticsClangImporter.def 诊断SIL.def 诊断IRGen.def DiagnosticsFrontend.def DiagnosticsDriver.def DiagnosticsRefactoring.def DiagnosticsCommon.def DiagnosticsAll.def での中で,DiagnosticsParse.def变成一个を抜粋するとこんな感じである。これは闭じ波括弧が多いというエラーメッセージ。 错误(extra_rbrace,none, “顶级的外部’}’”,() 定义数が多いものは,Swift4.1の时点で DiagnosticsParse.defに500以上 S800以上 ある。 ***の记事ではこのDiagnostics ***。defを「メッセージ定义ファイル」または「.defファイル」ということにする。 メッセージ定义の形式(水深0.7cm) メッセージ定义ファイル内の个々の定义は基本的に 错误(ID,选项,文本,签名) の形で行う。 ID エラーを识别を文字列。エラー発生处理でエラーを指定するのに用いる。 选项 何か付加情报を入れるようだが何もないことが多い 文本 コンパイル时に确定する部分は%が付けられている。これはC言语のprintfやObj-CのNSLog方式に似ている。 签名 Textのメーメッセージの中でコンパイル时に确定する部分の型をタプル形式で与える。文字の中でこれらが入る部分にはあらかじめ%が付けられている。 さっきのメッセージをあらためて见ると 错误(extra_rbrace,none, “顶级的外部’}’”,() […]