ヘッダーファイルで定義されている構造体のリストを取得します

vafylec

ヘッダーファイル内のすべての構造体のリストを取得したいと思います。たとえば、CommCtrl.hの構造体の選択です。

LVCOLUMNW,LVITEMW,REBARINFO,TVITEMW

これは、構造体のリストから始めて、それらのsizeof値を取得するというより広い目標に関連しています。

[STRUCT=sizeof64:sizeof32]
LVCOLUMNW=56:44
LVITEMW=88:60
REBARINFO=16:12
TVITEMW=56:40

現在、cppファイルをx64 / x32 exeとしてコンパイルして、ヘッダーファイルに構造体が含まれているかどうかを判断し(失敗すると空白が返されます)、構造体のsizeof値を判断します。

#define UNICODE 1
#include <iostream>
#include <Windows.h>

int main()
{
    std::cout << sizeof(BITMAPINFOHEADER) << std::endl;
    return 0;
}

構造体名を動的に参照したり、無効な構造体名を無視したりできれば、これをはるかに効率的に行うことができます。

最終的には、上記のコードを19486の「Winwords」のリストに適用したいと思います:http://katahiromz.web.fc2.com/win32/winwords.txt

別のアイデアは、可能であれば、VisualStudioプロジェクトで現在定義されているすべての構造体名のリストを取得することです。

vafylec

これは、AHKを介してヘッダーファイル(.hファイル)内の構造体を一覧表示し、C ++を介してそれらのサイズを取得するための暫定コードです。生成されたリストは100%完全であるとは限りませんが、スクリプトは構造体名の取得に非常に効果的であることが証明されています。CommCtrl.hおよびWinUser.hでテスト済み。

;AHK v2 script

#Warn
ListLines("Off")

;q:: ;list structs in a header file (.h file) (provisional script)
vPath := "C:\Program Files (x86)\Windows Kits\8.1\Include\um\CommCtrl.h"
;vPath := "C:\Program Files (x86)\Windows Kits\8.1\Include\um\WinUser.h"
if !FileExist(vPath)
{
    MsgBox("error: file not found:`r`n" vPath)
    return
}
vText := FileRead(vPath)
vDoGetNext := 0
vTemp2 := ""
vIndent := ""
VarSetCapacity(vOutput, 1000000*2)
VarSetCapacity(vListDefine, 1000000*2)
oDict := ComObjCreate("Scripting.Dictionary")

;get struct names from 'typedef struct' definitions
;and store potential struct names from '#define' directives
Loop Parse vText, "`n", "`r"
{
    vTemp := LTrim(A_LoopField) ;remove leading spaces/tabs
    vTemp := RegExReplace(vTemp, "[ `t]+", " ")
    vTemp := RegExReplace(vTemp, " //.*")
    if (SubStr(vTemp, 1, 7) = "#define")
    {
        ;ignore numeric definitions etc
        if !RegExMatch(vTemp, "[(\\\-:" Chr(34) "]| \d")
            vListDefine .= vTemp "`r`n"
        continue
    }

    vTemp := A_LoopField
    ;if (vPos := RegExMatch(vTemp, "typedef"))
    if (vPos := RegExMatch(vTemp, "typedef struct"))
    {
        vTemp2 := vTemp
        vIndent := SubStr(vTemp, 1, vPos-1)
        vDoGetNext := 1
    }
    else if vDoGetNext
    && (SubStr(vTemp, 1, StrLen(vIndent)+1) = vIndent "}")
    {
        vTemp := RegExReplace(vTemp, "^[} ]+|[,;].*")
        if !(vTemp = "")
        && !oDict.Exists("" vTemp)
        && !(vTemp = "DUMMYUNIONNAME")
        {
            oDict.Item["" vTemp] := 1
            vOutput .= vTemp "`r`n"
            ;vOutput .= vTemp2 "`t" vTemp "`r`n"
        }
        vDoGetNext := 0
    }
}

;get struct names from stored '#define' directives
;lines of the form '#define newname oldname'
vOutput .= "`r`n"
Loop Parse vListDefine, "`n", "`r"
{
    oTemp := StrSplit(A_LoopField, " ")
    if (oTemp.Length() = 3)
    && !oDict.Exists("" oTemp.2) ;new name not seen before
    && oDict.Exists("" oTemp.3) ;old name seen before
    {
        oDict.Item["" oTemp.2] := 1
        vOutput .= oTemp.2 "`r`n"
    }
}

;get raw list of structs:
;Clipboard := RTrim(vOutput, "`r`n") "`r`n"
;MsgBox(vOutput)

vList := vOutput
VarSetCapacity(vOutput, StrLen(vList)*10*2)
Loop Parse vList, "`n", "`r"
{
    vTemp := A_LoopField
    if (vTemp = "")
    {
        vOutput .= "`r`n"
        continue
    }
    vOutput .= "std::cout << " Chr(34) vTemp "=" Chr(34) " << sizeof(" vTemp ") << std::endl;`r`n"
}

Clipboard := RTrim(vOutput, "`r`n") "`r`n"
oDict := ""
MsgBox("done")
return

AHKスクリプトによって生成されたコードを使用したC ++コードの例。

//structs get sizes

#include "stdafx.h"
#include <iostream>
#include "Windows.h"
#include "CommCtrl.h"

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << "TVITEMA=" << sizeof(TVITEMA) << std::endl;
    std::cout << "TVITEMW=" << sizeof(TVITEMW) << std::endl;
    std::cout << "TVITEM=" << sizeof(TVITEM) << std::endl;
    std::getchar();
    return 0;
}

注:別のアプローチは、ヘッダーファイルから一意の文字列を取得し、それらをVisual Studioに貼り付け、Visual Studioが適切な単語に色を付けるのを待ち、リストをワードパッドにコピーし、rtfファイルとして保存し、生のrtfを解析して色を付けることです。言葉。

ここにも投稿されています:
C ++:ヘッダーファイルに構造体を一覧表示します-AutoHotkey Community

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

別のcファイルで定義されている構造体にアクセスしますか?

分類Dev

ヘッダーファイルで構造体を宣言し、.cファイルで定義するにはどうすればよいですか。

分類Dev

.ccファイルによってアクセスおよび入力されるヘッダーファイル内の構造体を宣言します

分類Dev

Cヘッダーファイルで定義された自己参照構造体はエラーを生成します

分類Dev

ヘッダーファイルから既存の構造体に演算子定義を追加するにはどうすればよいですか?

分類Dev

ヘッダーファイルの省略された構造体の再定義は標準に準拠していますか?

分類Dev

ヘッダーファイルで定義された構造体を関数パラメーターとして使用する場合、「不完全な型は許可されません」

分類Dev

C-ヘッダーファイルの構造体定義

分類Dev

不透明な構造体定義を別のヘッダーファイルに入れる

分類Dev

Elixirは、定義されているのと同じファイルに構造体を作成できません

分類Dev

C ++では、ソースファイルで定義されている間にヘッダーファイルでデータ構造を宣言するにはどうすればよいですか?

分類Dev

メインプログラムのヘッダーで定義されたスタック構造体の配列のデータ型を定義する

分類Dev

Swiftはcで定義された構造体のダブルポインターを定義します

分類Dev

ヘッダーのないアップストリームフラットファイルの構造変更に続いて、新しいインポートコードを生成するにはどうすればよいですか?

分類Dev

ヘッダーファイルで定義されていないデストラクタの変数を使用できますか?

分類Dev

ヘッダーファイルの構造体定義で行われた文字列宣言

分類Dev

c ++-ヘッダーファイルで使用するときに構造体が認識されない

分類Dev

ヘッダーファイルを宣言した後のC ++構造体が認識されない

分類Dev

CGoがヘッダーファイルで宣言された構造体を認識しないのはなぜですか?

分類Dev

ヘッダーファイル内で定義された複数の構造-それらを別々のhファイルとcppファイルに移動する必要があります

分類Dev

C ++でヘッダーファイルなしで構造体と関数をリンクする

分類Dev

ヘッダーファイルで宣言された構造体変数を複数のソースファイルにインクルードするにはどうすればよいですか?

分類Dev

goとmongodbを使用して別の構造体の内部で定義された型構造体のスライスを取得する方法

分類Dev

nilポインターで定義された型からのリフレクトで新しい構造体を作成します

分類Dev

名前空間を使用するグローバル構造体を定義して、構造体を使用するファイルがこの名前空間を使用しないようにするにはどうすればよいですか?c ++

分類Dev

ヘッダーファイルの構造体がソースファイルにエラーを生成する

分類Dev

構造体に含まれるtypedefで定義されたネイティブ型のシリアル化をブーストする

分類Dev

複数のファイルで使用されるヘッダーファイルで構造体を宣言すると、アーキテクチャx86_64のシンボルが重複します

分類Dev

C ++のヘッダーファイルで定義されているものを「隠す」ことはできますか

Related 関連記事

  1. 1

    別のcファイルで定義されている構造体にアクセスしますか?

  2. 2

    ヘッダーファイルで構造体を宣言し、.cファイルで定義するにはどうすればよいですか。

  3. 3

    .ccファイルによってアクセスおよび入力されるヘッダーファイル内の構造体を宣言します

  4. 4

    Cヘッダーファイルで定義された自己参照構造体はエラーを生成します

  5. 5

    ヘッダーファイルから既存の構造体に演算子定義を追加するにはどうすればよいですか?

  6. 6

    ヘッダーファイルの省略された構造体の再定義は標準に準拠していますか?

  7. 7

    ヘッダーファイルで定義された構造体を関数パラメーターとして使用する場合、「不完全な型は許可されません」

  8. 8

    C-ヘッダーファイルの構造体定義

  9. 9

    不透明な構造体定義を別のヘッダーファイルに入れる

  10. 10

    Elixirは、定義されているのと同じファイルに構造体を作成できません

  11. 11

    C ++では、ソースファイルで定義されている間にヘッダーファイルでデータ構造を宣言するにはどうすればよいですか?

  12. 12

    メインプログラムのヘッダーで定義されたスタック構造体の配列のデータ型を定義する

  13. 13

    Swiftはcで定義された構造体のダブルポインターを定義します

  14. 14

    ヘッダーのないアップストリームフラットファイルの構造変更に続いて、新しいインポートコードを生成するにはどうすればよいですか?

  15. 15

    ヘッダーファイルで定義されていないデストラクタの変数を使用できますか?

  16. 16

    ヘッダーファイルの構造体定義で行われた文字列宣言

  17. 17

    c ++-ヘッダーファイルで使用するときに構造体が認識されない

  18. 18

    ヘッダーファイルを宣言した後のC ++構造体が認識されない

  19. 19

    CGoがヘッダーファイルで宣言された構造体を認識しないのはなぜですか?

  20. 20

    ヘッダーファイル内で定義された複数の構造-それらを別々のhファイルとcppファイルに移動する必要があります

  21. 21

    C ++でヘッダーファイルなしで構造体と関数をリンクする

  22. 22

    ヘッダーファイルで宣言された構造体変数を複数のソースファイルにインクルードするにはどうすればよいですか?

  23. 23

    goとmongodbを使用して別の構造体の内部で定義された型構造体のスライスを取得する方法

  24. 24

    nilポインターで定義された型からのリフレクトで新しい構造体を作成します

  25. 25

    名前空間を使用するグローバル構造体を定義して、構造体を使用するファイルがこの名前空間を使用しないようにするにはどうすればよいですか?c ++

  26. 26

    ヘッダーファイルの構造体がソースファイルにエラーを生成する

  27. 27

    構造体に含まれるtypedefで定義されたネイティブ型のシリアル化をブーストする

  28. 28

    複数のファイルで使用されるヘッダーファイルで構造体を宣言すると、アーキテクチャx86_64のシンボルが重複します

  29. 29

    C ++のヘッダーファイルで定義されているものを「隠す」ことはできますか

ホットタグ

アーカイブ