[c] C에서 가장 일반적인 명명 규칙은 무엇입니까?

C에서 일반적으로 사용되는 명명 규칙은 무엇입니까? 적어도 두 가지가 있다는 것을 알고 있습니다.

  1. GNU / Linux / K & R with lower_case_functions
  2. ? 이름? UpperCaseFoo 함수 사용

여기서 만 C에 대해 이야기하고 있습니다. 대부분의 프로젝트는 C를 사용하는 소형 임베디드 시스템입니다.

다음 프로젝트에 사용할 계획입니다.


C 명명 규칙

Struct              TitleCase
Struct Members      lower_case or lowerCase

Enum                ETitleCase
Enum Members        ALL_CAPS or lowerCase

Public functions    pfx_TitleCase (pfx = two or three letter module prefix)
Private functions   TitleCase
Trivial variables   i,x,n,f etc...
Local variables     lower_case or lowerCase
Global variables    g_lowerCase or g_lower_case (searchable by g_ prefix)



답변

여기서 가장 중요한 것은 일관성입니다. 즉, 다음과 같이 요약 할 수있는 GTK + 코딩 규칙을 따릅니다.

  1. 대문자로 된 모든 매크로 및 상수 : MAX_BUFFER_SIZE, TRACKING_ID_PREFIX.
  2. 카멜 케이스의 구조체 이름과 typedef : GtkWidget, TrackingOrder.
  3. 구조체에서 작동하는 함수 : 클래식 C 스타일 : gtk_widget_show(), tracking_order_process().
  4. 포인터 : 여기에 멋진 것은 없습니다 :
    GtkWidget *foo, TrackingOrder *bar.
  5. 전역 변수 : 전역 변수를 사용하지 마십시오. 그들은 사악합니다.
  6. 거기에 있지만 직접 호출해서는 안되는 함수, 사용이 모호한 것 등 : 처음에 하나 이상의 밑줄 :
    _refrobnicate_data_tables(), _destroy_cache().

답변

“구조 포인터”는이를 다루기 위해 명명 규칙 절이 필요한 엔티티가 아닙니다. 그들은 단지 struct WhatEver *. 영리하고 “명백한”typedef와 관련된 포인터가 있다는 사실을 숨기지 마십시오. 목적이없고 더 이상 입력 할 수 없으며 선언과 액세스 사이의 균형을 파괴합니다.


답변

첫째로 C에는 공개 / 개인 / 가상 기능이 없습니다. 그것은 C ++이고 다른 규칙을 가지고 있습니다. C에서는 일반적으로 다음이 있습니다.

  • ALL_CAPS의 상수
  • 구조체 또는 함수 이름에서 단어를 구분하는 밑줄, C에서 카멜 케이스를 거의 볼 수 없습니다.
  • 구조체, typedef, 공용체, 멤버 (조합 및 구조체의) 및 열거 형 값은 일반적으로 첫 글자를 대문자로 만드는 C ++ / Java / C # / etc 규칙이 아닌 소문자 (내 경험상)이지만 다음에서 가능하다고 생각합니다. C도.

C ++는 더 복잡합니다. 여기서 진짜 믹스를 보았습니다. 클래스 이름 또는 소문자 + 밑줄에 대한 카멜 케이스 (내 경험상 낙타 케이스가 더 일반적 임). 구조체는 거의 사용되지 않습니다 (일반적으로 라이브러리에 필요하기 때문에, 그렇지 않으면 클래스를 사용합니다).


답변

알다시피, 저는 단순하게 유지하고 싶지만 명확하게 … 그래서 C에서 제가 사용하는 것은 다음과 같습니다.

  • Trivial Variables : i,n,c, etc … (단 하나의 문자. 하나의 문자가 명확하지 않으면 로컬 변수로 만드십시오)
  • 지역 변수 :lowerCamelCase
  • 전역 변수 :g_lowerCamelCase
  • 상수 변수 :ALL_CAPS
  • 포인터 변수 : p_접두사 에 a 를 추가 합니다. 전역 변수의 경우 gp_var지역 변수 p_var의 경우 const 변수가 p_VAR됩니다. 먼 포인터를 사용하는 fp_경우 p_.
  • Structs : ModuleCamelCase(Module = 전체 모듈 이름 또는 2-3 자 약어이지만 여전히 CamelCase.)
  • 구조체 멤버 변수 :lowerCamelCase
  • 열거 형 :ModuleCamelCase
  • 열거 형 값 :ALL_CAPS
  • 공공 기능 :ModuleCamelCase
  • 개인 기능 :CamelCase
  • 매크로 :CamelCase

내 구조체를 typedef하지만 태그와 typedef 모두에 동일한 이름을 사용합니다. 태그는 일반적으로 사용되지 않습니다. 대신 typedef를 사용하는 것이 좋습니다. 또한 캡슐화를 위해 공용 모듈 헤더에 typedef를 전달하여 정의에서 typedef의 이름을 사용할 수 있습니다.

전체 struct :

typdef struct TheName TheName;
struct TheName{
    int var;
    TheName *p_link;
};


답변

C #, Java, C, C ++ 및 객관적인 C 로 동시에 코딩하면서 저는 삶을 단순화하기 위해 매우 간단하고 명확한 명명 규칙을 채택했습니다.

우선, 그것은 최신 IDE (예 : eclipse, Xcode …)의 힘에 의존하며, 마우스를 가져 가거나 ctrl을 클릭하여 빠른 정보를 얻을 수있는 가능성을 가지고 있습니다. 그것을 받아들이고, 접두사, 접미사 사용을 억제했습니다. 및 단순히 IDE에서 제공하는 기타 마커.

그런 다음 컨벤션 :

  • 모든 이름은 가지고있는 것을 설명하는 읽기 쉬운 문장이어야합니다. “이건 내 컨벤션”처럼.
  • 그런 다음 문장에서 관례를 얻는 4 가지 방법 :
    1. 매크로, 열거 형 멤버의 경우 THIS_IS_MY_CONVENTION
    2. ThisIsMyConvention for file name, object name (class, struct, enum, union …), function name, method name, typedef
    3. this_is_my_convention 전역 및 지역 변수,
      매개 변수, 구조체 및 공용체 요소
    4. thisismyconvention [선택 사항] 매우 지역적이고 임시적인 변수 (for () 루프 인덱스와 같은)

그리고 그게 다야.

그것은 준다

class MyClass {
    enum TheEnumeration {
        FIRST_ELEMENT,
        SECOND_ELEMENT,
    }

    int class_variable;

    int MyMethod(int first_param, int second_parameter) {
        int local_variable;
        TheEnumeration local_enum;
        for(int myindex=0, myindex<class_variable, myindex++) {
             localEnum = FIRST_ELEMENT;
        }
    }
}


답변

나는 낙타 케이스와 밑줄 분리를 혼합하지 않는 것이 좋습니다 (구조 멤버에게 제안한 것처럼). 이것은 혼란 스럽습니다. 당신은 생각할 것입니다, 헤이 내가 가지고 get_length있기 때문에 아마도 내가 있어야 할 것이고 make_subset당신은 그것이 실제로 makeSubset. 최소한 경악의 원칙을 사용하고 일관성을 유지하십시오.

CamelCase는 구조체, typedef 및 enum과 같은 이름을 입력하는 데 유용합니다. 그래도 그게 전부입니다. 나머지 (함수 이름, 구조체 멤버 이름 등)는 underscore_separation을 사용합니다.


답변

다음은 CamelCase의 모듈 이름, 밑줄, CamelCase의 함수 또는 파일 범위 이름입니다. 예를 들면 :

Bluetooth_Init()
CommsHub_Update()
Serial_TxBuffer[]