-
-
Save davidzchen/9187878 to your computer and use it in GitHub Desktop.
| // Sample file using the Google C++ coding standard. | |
| // | |
| // http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml | |
| // | |
| // General rules: | |
| // - Indents are two spaces. No tabs should be used anywhere. | |
| // - Each line must be at most 80 characters long. | |
| // - Comments can be // or /* but // is most commonly used. | |
| // - File names should be lower_case.c or lower-case.c | |
| // | |
| // Note: The Google C++ coding standard is a C++ coding standard. There are | |
| // aspects specific to C that the coding standard does not specify, and these | |
| // exceptions are noted below. | |
| #include <stdlib.h> | |
| #include <stdbool.h> | |
| // For macros, use ALL_CAPS separated by underscore: | |
| #define FLAG_FOO 0x0 | |
| // If a macro's replacement is not just a literal, enclose it in parentheses: | |
| #define FLAG_BAZ (0x1 << 3) | |
| // For constants, use k followed by PascalCase: | |
| const int kStateFoo = 0; | |
| // Type names should be PascalCase. | |
| // Note: the Google coding standard does not specify how to format a struct | |
| // name that has not been typedef-ed. I am following the lower_case separated | |
| // by underscores format for now but this can be changed later. | |
| typedef struct linked_list LinkedList; | |
| // Enum values can either look like macros: | |
| typedef enum { | |
| MODE_FOO, | |
| MODE_BAR, | |
| MODE_BAZ, | |
| MODE_QUX | |
| } Mode; | |
| // or they can look like contants: | |
| typedef enum { | |
| kStateFoo, | |
| kStateBar, | |
| kStateBaz, | |
| kStateQux | |
| } State; | |
| // Names of members of structs are lower_case and separated by underscores: | |
| typedef struct sample { | |
| int first_field; | |
| bool second_field; | |
| Mode mode; | |
| State state; | |
| struct sample *next; | |
| } Sample; | |
| // Function names are PascalCase. Opening braces come at the end of the last | |
| // line for the function declaration rather than on the next line. | |
| bool SampleEqual(Sample *self, Sample *other) { | |
| // Local variables are lower_case and separated by underscores. | |
| if (self == NULL && other == NULL) { | |
| return true; | |
| } | |
| if (self == NULL || other == NULL) { | |
| return false; | |
| } | |
| // For statements that span multiple lines, break after the logical operator | |
| // and align each line with the start of the first line. | |
| if (self->first_field == other->first_field && | |
| self->second_field == other->second_field && | |
| self->state == other->state && | |
| self->mode == other->mode && | |
| self->next == other->next) { | |
| return true; | |
| } | |
| // If the previous block ends with areturn (or break or continue), do not | |
| // follow it with an else. | |
| return false; | |
| } | |
| // For function declarations that span multiple lines, then align subsequent | |
| // lines with the first parameter. | |
| Sample *SampleNew(int first_field, | |
| bool second_field, | |
| Mode mode, | |
| State state, | |
| Sample *next) { | |
| Sample *sample = (Sample *) malloc(sizeof(*sample)); | |
| if (sample == NULL) { | |
| return NULL; | |
| } | |
| memset(sample, 0, sizeof(sample)); | |
| sample->first_field = first_field; | |
| sample->second_field = second_field; | |
| sample->mode = mode; | |
| sample->state = state; | |
| sample->next = next; | |
| return sample; | |
| } | |
| Sample *SampleClone(Sample *sample) { | |
| if (sample == NULL) { | |
| return NULL; | |
| } | |
| // For function calls that span multiple lines, align each subsequent line. | |
| return SampleNew(sample->first_field, | |
| sample->second_field, | |
| sample->mode, | |
| sample->state, | |
| sample->next); | |
| } | |
| // For function declarations (and function calls) where you cannot fit | |
| // the parameters with the first after the opening parentheses, then align | |
| // the parameters indented four spaces on the next line: | |
| static void SampleDoSomethingWithALongName( | |
| Sample *sample, | |
| int parameter_with_a_long_name, | |
| bool another_parameter, | |
| int another_parameter) { | |
| if (sample == NULL) { | |
| return; | |
| } | |
| // else and else if comes after the previous closing brace and not on the | |
| // next line. | |
| bool local_variable; | |
| if (parameter_with_a_long_name == kStateFoo) { | |
| local_variable = true; | |
| } else { | |
| local_variable = false; | |
| } | |
| sample->first_parameter += another_parameter; | |
| sample->second_parameter |= local_variable; | |
| } |
Is the opening brace for the main function should also be at the end of the function declaration line?
@fukien I think yes, this rule is for any function, as I see from sample-google.c
Has anyone created a .clang_format file that hews to this style? I'd like...
C and C++ are different languages. You mention that this is "the Google C++ coding standard" and yet your file is C.
Are Googlers still posting incredibly idiotic and disrespecful garbage on Memegen mocking other companies/products? Tell Kent Walker I said hello.
C and C++ are different languages. You mention that this is "the Google C++ coding standard" and yet your file is C.
In case you missed it " Sample C code using the Google C++ style guide ", top of the page
line 96 should be memset(sample, 0, sizeof(*sample));
Is the opening brace for the main function should also be at the end of the function declaration line?