3

次のようなキャストをリファクタリング/置換するためのツールまたはメソッドの推奨事項:

(type*) data

の中へ:

convert_to_type(data)

data優先順位の高い演算子、括弧、または改行が含まれていると、事態はさらに複雑になります。

(type*) a(b)->
              c

ならconvert_to_type(a(b)->c)ないconvert_to_type(a)(b)->cなど。

4

4 に答える 4

3

これらを適切に解析して自動的に置き換えることができるツールを知りません。

私が知っている最良のオプションは、g++ を使用すること-Wold-style-castです。これにより、そのようなすべての C スタイルのキャストについて警告が表示され、問題のコードを分析して適切に処理できるようになります。これは明らかにツールよりも時間がかかりますが、ツールが間違った変換を行うことを確認して防止する機会も与えてくれます。

于 2013-03-14T13:36:32.297 に答える
2

この場合、セマンティックを意識した C++ パーサーが必要になります。道具はそれほど多くありません。

実際、私が思いつくのは Clang だけです。その AST Matchersを使用して、C スタイルのキャストに対応する AST ノードを取得し、テキスト置換を発行するプログラムを作成できます。Clang の AST は完全にセマンティックを認識しているため、変換中の式、その型、および変換後の型の両方にアクセスできます。

ツールまたは追加セクションに例があります。たとえば、一致置換の両方についてCpp11Migrateツールを確認できます。

注:この道をたどる場合は、 Clang の ASTに慣れる必要があります。

于 2013-03-14T14:49:48.253 に答える
1

次のようなキャストをリファクタリング/置換するためのツールまたはメソッドの推奨事項:

ないはずです。この問題は非常にトリッキーで、C++ キャスト (static_cast、cost_cast など) が作成されたとき、明示的な目標の 1 つは「自動化されたツールを使用してコード内で簡単に見つけられるようにすること」でした。

場合によっては、1 対の括弧が算術演算 (演算子の優先度に使用される括弧)、キャスト、またはその他に使用されているかどうかを判断する前に、ツールで完全な解析が必要になることがあります。

それらを 1 つずつ変更することをお勧めします (そうすることでエラーが少なくなります)。

コード ベースが大きい場合は、この目的のために独自のツールを作成することも有効です (gcc にはこれに関する警告があるため、簡単に見つけることができます)。

于 2013-04-05T08:00:11.147 に答える
0

これはある時点であなたの顔に爆発すると思いますが、

template<typename T> T myFunc()
{
    // do stuff
    return (T) retVal;
}
于 2013-03-14T12:06:49.680 に答える