Guter code-formatter?



  • Hej,

    kennt ihr einen guten code-formatter für C++ der kommandozeilentauglich ist?

    ICh habe jetzt astyle und clang-format in die ecke geworfen, weil sie beide meinen Anforderungen nicht genügen:

    1. astyle und clang-format zerstören mir die Formatierung von komplexeren Template-argumenten. Wenn ich zum Beispiel sowas habe:

    iterator_base_traits<
    	typename iterator_restrict_traits<
    		typename Iterator1::iterator_category,
    		typename Iterator2::iterator_category
    	>::iterator_category
    >::template iterator_base<
    	binary_transform_iterator<Iterator1,Iterator2,F>,
    	typename F::result_type
    >::type
    

    dann wird mir das wie normaler code formatiert, das heisst alle zeilenumbrüche entfernt und standardzeilenumbrauch nach 80-120 zeichen.

    2.clang-format bastelt mir zu sehr an Parameterlisten /Funktionsdeklarationen rum. Wenn ich Zeilen umbreche, dann mache ich das auch nach logischen Gesichtspunkten, hier mal ein Extrembeispiel:

    inline void gemm(
    	CBLAS_ORDER const Order, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB,
    	int M, int N, int K,
    	float alpha,
    	float const* A, int lda,
    	float const* B, int ldb,
    	float beta,
    	float* C,int ldc
    ){
    	cblas_sgemm(
    		Order, TransA, TransB,
    		M, N, K,
    		alpha,
    		A, lda,
    		B, ldb,
    		beta,
    		C, ldc
    	);
    }
    

    Das wird von clang-format komplett zerstört und ich hab nur die Wahl zwischen "zeilenumbruch bei zeilenende" oder "ein argument pro Zeile". Zusätzlich will astyle das erste argument direkt neben "cblas_sgemm(" positionieren und akzeptiert keinen zeilenumbruch. Astyle macht das besser. Der obige Code wird von astyle (je nach optionen) 1:1 erzeugt, wenn man nach den "(" umbricht.

    3. astyle verschluckt sich an manchen kontruktionen und rückt dann nicht nachvollziehbar ein.

    Ich überlege mir gerade, ob ich mir selbst einen einfachen Parser für die Einrückungen schreiben sollte. So schwer sollte das nicht sein, die Anzahl der Regeln die ich brauche ist ja eher gering...



  • Dieser Thread wurde von Moderator/in Arcoth aus dem Forum C++ (alle ISO-Standards) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • du kannst, zumindest clang, sagen das er einen Code Abschnitt nicht formatieren soll

    ansonsten kenne ich nur uncrustify
    http://uncrustify.sourceforge.net/

    etwas mühsam zum einrichten, config files erzeugen,
    am besten fangt man mit einer leeren config an und packt nur das rein was man haben möchte
    wenn du nix zu Funktionen in der config hast dann werden die auch nicht formatiert.
    uncrustify kennt auch ein 'die zeilen nicht anrührern', und ich denke das ist was du brauchst, denn wie soll ein Formatierer erkennen was du formatiert haben möchtest und was nicht.



  • (die Frage nach einem Code-Formatter für C++ ist keine Prg-Sprachübergreifende Frage (obwohl es indirekt sein könnte (Notepad++ oder Vim Plugins -> http://stackoverflow.com/questions/2506776/is-it-possible-to-format-c-code-with-vim usw.)



  • Dieser Thread wurde von Moderator/in nachtfeuer aus dem Forum Rund um die Programmierung in das Forum C++ (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • otze schrieb:

    2.clang-format bastelt mir zu sehr an Parameterlisten /Funktionsdeklarationen rum. Wenn ich Zeilen umbreche, dann mache ich das auch nach logischen Gesichtspunkten, hier mal ein Extrembeispiel:

    inline void gemm(
    	CBLAS_ORDER const Order, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB,
    	int M, int N, int K,
    	float alpha,
    	float const* A, int lda,
    	float const* B, int ldb,
    	float beta,
    	float* C,int ldc
    ){
    	cblas_sgemm(
    		Order, TransA, TransB,
    		M, N, K,
    		alpha,
    		A, lda,
    		B, ldb,
    		beta,
    		C, ldc
    	);
    }
    

    Wie wäre es mit struct , um Variablen zu gruppieren?



  • Mal schauen, wo der Thread noch überall hinverschoben wird.

    @kurze_frage

    Mir gehts nicht darum, dass bestimmte Bereiche nicht formatiert werden sollen,dafür währen das zu viele und ich habe gerade nicht die Zeit, die 80k Zeilen des Projektes durchzugehen und dem Formatter zu verbieten, Dinge zu formaiteren. Aber sie sollen sinnvoll formatiert werden. Ich kann damit leben, wenn der formatter es anders formatiert, als ich es würde, aber es scheint einfach überhaupt keine Regeln für Templates zu geben.

    Ich schaue mir uncrustify mal an, vielleicht kann der das.

    @TyRoXx Danke für den Tipp, wäre ich selber nicht drauf gekommen. War aber echt zu viel aufwand, da es 4 versionen von der funktion im c-backend gibt. Und ich musste es eh in mein C++ frontend integrieren, also hab ichs so gemacht:

    template <typename MatrA, typename MatrB, typename MatrC>
    void gemm(
    	matrix_expression<MatrA> const &matA,
    	matrix_expression<MatrB> const &matB,
    	matrix_expression<MatrC>& matC, 
    	typename MatrC::value_type alpha
    ) {
    	SIZE_CHECK(matA().size1() == matC().size1());
    	SIZE_CHECK(matB().size2() == matC().size2());
    	SIZE_CHECK(matA().size2()== matB().size1());
    
    	CBLAS_TRANSPOSE transA = traits::same_orientation(matA,matC)?CblasNoTrans:CblasTrans;
    	CBLAS_TRANSPOSE transB = traits::same_orientation(matB,matC)?CblasNoTrans:CblasTrans;
    	std::size_t m = matC().size1();
    	std::size_t n = matC().size2();
    	std::size_t k = matA().size2();
    	CBLAS_ORDER stor_ord = (CBLAS_ORDER) storage_order<typename MatrC::orientation >::value;
    
    	gemm(
    		stor_ord, transA, transB,
    		(int)m, (int)n, (int)k, alpha,
    		traits::storage(matA()),
    		traits::leading_dimension(matA()),
    		traits::storage(matB()),
    		traits::leading_dimension(matB()),
    		typename MatrC::value_type(1),
    		traits::storage(matC()),
    		traits::leading_dimension(matC())
    	);
    }
    


  • update:

    uncrustify verchluckt sich auch und produziert sinnlose einrückungen:

    namespace shark {
    	template<class Closure>
    	struct indexed_iterator{
    		typedef typename boost::mpl::if_<
    			boost::is_const<
    				Closure
    			>,
    			typename Closure::const_reference,
    			typename Closure::reference
    		>::type reference;
    	};
    }
    

    ->

    namespace shark {
    	template<class Closure>
    	struct indexed_iterator {
    		typedef typename boost::mpl::if_<
    		                boost::is_const<
    		                        Closure
    		                >,
    		                typename Closure::const_reference,
    		                typename Closure::reference
    >::type reference;
    	};
    }
    

    😞


Log in to reply