2015-05-05 24 views
8

định dạng clang có 2 tùy chọn được gọi là BinPackParametersBinPackArguments. Họ dường như kiểm soát cách khai báo chức năng và các cuộc gọi hàm được thụt vào.BinPackArguments định dạng clang không hoạt động như mong đợi

BinPackParameters dường như cung cấp kết quả mong đợi cho khai báo hàm nhưng BinPackArguments dường như không hoạt động như mong đợi cho cuộc gọi hàm.

Đây là một tập tin thử nghiệm đơn giản:

#include <stdbool.h> 

void function_with_a_huge_name_that_should_just_not_be(unsigned int a, char *b, unsigned int c, unsigned int d, unsigned int e) 
{ 
    return; 
} 

int main() 
{ 
    function_with_a_huge_name_that_should_just_not_be(13, "bb", 1234234, 4324324, 2355345); 
} 

Và đây là cách nó được định dạng:

#include <stdbool.h> 

void function_with_a_huge_name_that_should_just_not_be(unsigned int a, 
    char *b, 
    unsigned int c, 
    unsigned int d, 
    unsigned int e) 
{ 
    return; 
} 

int main() 
{ 
    function_with_a_huge_name_that_should_just_not_be(
     13, "bb", 1234234, 4324324, 2355345); 
} 

tập tin .clang-format của tôi là như sau:

--- 
AccessModifierOffset: -2 
AlignAfterOpenBracket: false 
AlignEscapedNewlinesLeft: false 
AlignOperands: true 
AlignTrailingComments: true 
AllowAllParametersOfDeclarationOnNextLine: false 
AllowShortBlocksOnASingleLine: false 
AllowShortCaseLabelsOnASingleLine: false 
AllowShortIfStatementsOnASingleLine: false 
AllowShortLoopsOnASingleLine: false 
AllowShortFunctionsOnASingleLine: Inline 
AlwaysBreakAfterDefinitionReturnType: false 
AlwaysBreakBeforeMultilineStrings: false 
AlwaysBreakTemplateDeclarations: false 
BinPackParameters: false 
BinPackArguments: false 
BreakBeforeBinaryOperators: None 
BreakBeforeBraces: Linux 
BreakBeforeTernaryOperators: true 
BreakConstructorInitializersBeforeComma: true 
ColumnLimit:  80 
CommentPragmas: '^ IWYU pragma:' 
ConstructorInitializerAllOnOneLineOrOnePerLine: true 
ConstructorInitializerIndentWidth: 4 
ContinuationIndentWidth: 4 
Cpp11BracedListStyle: false 
DerivePointerAlignment: false 
IndentCaseLabels: false 
IndentWidth:  4 
IndentWrappedFunctionNames: false 
IndentFunctionDeclarationAfterType: false 
KeepEmptyLinesAtTheStartOfBlocks: false 
Language:  Cpp 
MaxEmptyLinesToKeep: 2 
NamespaceIndentation: None 
ObjCBlockIndentWidth: 2 
ObjCSpaceAfterProperty: false 
ObjCSpaceBeforeProtocolList: true 
PenaltyBreakBeforeFirstCallParameter: 19 
PenaltyBreakComment: 300 
PenaltyBreakString: 1000 
PenaltyBreakFirstLessLess: 120 
PenaltyExcessCharacter: 1000000 
PenaltyReturnTypeOnItsOwnLine: 60 
PointerAlignment: Right 
SpaceAfterCStyleCast: false 
SpaceBeforeAssignmentOperators: true 
SpaceBeforeParens: ControlStatements 
SpaceInEmptyParentheses: false 
SpacesBeforeTrailingComments: 2 
SpacesInAngles: false 
SpacesInCStyleCastParentheses: false 
SpacesInContainerLiterals: false 
SpacesInParentheses: false 
SpacesInSquareBrackets: false 
Standard:  Auto 
TabWidth:  4 
UseTab:   Never 

clang- My phiên bản định dạng là: 3.6.0 (tags/RELEASE_360/final)

Với cả hai BinPackParametersBinPackArguments là sai, tôi đã dự kiến ​​sẽ nhận được cùng một thụt đầu dòng cho lệnh gọi hàm như tôi đang nhận cho khai báo hàm.

Bất kỳ ý tưởng nào tôi đang làm sai?

Trả lời

1

Cố gắng thiết lập ColumnLimit đến 0. Có vẻ như tùy chọn này "ghi đè" hoặc có mức ưu tiên cao hơn BinPackParametersBinPackArguments tùy chọn.

+2

Cảm ơn nhưng với 'ColumnLimit' 0 không có thay đổi về kiểu dáng vì không có dòng nào có thể được coi là quá lớn để cần phá vỡ. – Lefteris

+0

Điều này thực sự làm việc cho tôi. "Giới hạn cột 0 có nghĩa là không có giới hạn cột. Trong trường hợp này, định dạng clang sẽ tôn trọng quyết định vi phạm của đầu vào trong báo cáo trừ khi chúng mâu thuẫn với các quy tắc khác." http://clang.llvm.org/docs/ClangFormatStyleOptions.html – cs01

+1

Có khắc phục không? Tôi cũng đặt một lỗi về LLVM liên quan đến vấn đề này, bởi vì tôi không thể sử dụng định dạng clang với lỗi khủng khiếp này: https://bugs.llvm.org/show_bug.cgi?id=35968 – Taw

0

Tùy chọn BinPack * được đặt thành false sẽ buộc tham số/đối số là tất cả trên một dòng hoặc mỗi dòng trên một dòng riêng biệt. Cả hai trường hợp đều được phép, nhưng không được trộn, ví dụ như. hai tham số trên một dòng và các tham số còn lại trên một dòng khác không được phép.

định dạng clang dường như chọn tất cả-trên-một dòng so với từng định dạng riêng biệt cho mỗi trường hợp.

1

Tôi không nghĩ bạn đang làm gì sai. Điều gì xảy ra là định dạng clang nhận ra rằng dòng bạn đang gọi hàm dài hơn giới hạn cột của bạn (80 ký tự trong cài đặt của bạn). AlignAfterOpenBracket của bạn được đặt thành false, do đó, định dạng clang đặt các đối số trên một dòng mới (Lưu ý rằng AlignAfterOpenBracket đã đạt được các khả năng bổ sung trong các phiên bản sau của định dạng clang).

Bạn đã đặt cả hai cài đặt BinPack... thành false, tuy nhiên có cài đặt bổ sung kiểm soát khai báo hàm so với lệnh gọi hàm, AllowAllParametersOfDeclarationOnNextLine (được đặt thành sai trong ví dụ của bạn). Đối với khai báo hàm, điều này sẽ làm cho tất cả các tham số nằm trên các dòng riêng biệt nếu chúng không vừa trên cùng một dòng với tên hàm. Đối với cuộc gọi chức năng, không có cài đặt tương ứng.

Trong trường hợp của bạn, các đối số mà bạn cung cấp cho hàm được đặt trên dòng tiếp theo sau tên hàm. Độ dài của dòng thứ hai là < 80, do đó, định dạng clang không làm gì hơn với nó. Nếu dòng đối số sẽ dài hơn giới hạn cột của bạn, định dạng clang sẽ đặt chúng trên các dòng riêng biệt. Vì vậy, câu trả lời là kể từ phiên bản 3.9, không có cách nào để cấu hình định dạng clang để đặt mỗi đối số trên một dòng riêng biệt nếu chúng phù hợp trên một dòng.

Các vấn đề liên quan