`m_` 변수 접두사는 무엇을 의미합니까?


155

나는 종종 볼 m_접두사 변수에 사용 ( m_World, m_Sprites주로 게임 개발에 관련된 튜토리얼, 예 및 기타 코드, ...).

사람들 m_이 변수 에 접두사 를 추가하는 이유는 무엇 입니까?



18
헝가리어 표기법을 염두에두기 전에 헝가리어 표기법이 실제로 무엇인지 확인하십시오. int iCounter의 이름을 지정하는 것은 의미가 없습니다. 그러나 int xAnnotationPos 및 yAnnotationPos의 이름을 지정하는 것이 합리적입니다. 시맨틱 버전을 사용하십시오.
AkselK

때로는 가져온 모듈이 함수와 변수를 접두어 자신의 코드로 덮어 쓰지 않을 수도 있습니다. 특정 용도로 이름을 '예약'하는 방법입니다.
earthmeLon

3
"헝가리어"표기법은 종종 악의적으로 표현되지만, 가변 범위를 나타내는 특정 풍미에는 몇 가지 실질적인 이점이 있습니다. 변수의 범위를 식별하는 것 외에도 로컬, parm 및 멤버가 모두 같은 의도를 갖고 동일한 "의미"이름 인 경우와 같이 이름 충돌을 방지합니다. 이로 인해 큰 코드 기반의 유지 관리가 더 간단하고 오류 발생 가능성이 줄어 듭니다.
핫 릭

8
어떤 코딩 표준에 대해서도 반대되는 주장이 있지만,이 질문은 무엇을 m_위한 것인지 명확하게 묻지 만, 여기에있는 응답의 절반은 모든 사람들이 현재 자신이 좋아하는 것이 최고라고 생각하는 이유에 대한 주석입니다.
cz

답변:


108

멤버 변수 인 변수를 정의하기위한 일반적인 프로그래밍 방법입니다. 따라서 나중에 사용하는 경우 범위를 알기 위해 정의 된 위치를 볼 필요가 없습니다. 범위를 이미 알고 있고 intelliSense 와 같은 것을 사용하고 있다면 시작할 수 m_있으며 모든 멤버 변수 목록이 표시됩니다. 헝가리 표기법의 일부는 여기 예제의 범위에 대한 부분을 참조 하십시오 .


51
명명 규칙에 대한 최악의 논쟁은 간단하게 인텔리전스를 위해 Ctrl + Space를 누르는 것입니다.
orlp

11
@nightcracker event 나는 접두사가 마음에 들지 않지만 m_을 입력 한 다음 "CTRL + SPACE"(자동이 아닌 경우)를 입력하면 멤버가 포함 된 목록 만 가져옵니다. 정확히 좋은 이유는 아니지만 플러스입니다.
Sidar

13
같은 일을하는 다른 표준 방법이 많다는 점을 언급 할 가치가 있습니다. "m_variable", "m_Variable", "mVariable", "_variable", "_Variable"... '최고'또는 '올바른'(또는 전혀하지 않을 것)의 방식은 공백 대 탭 '. :)
Trevor Powell

49
난 그냥 "this->"를 사용하는 것을 선호합니다-kinda는 "m_"을 중복으로 만들고 컴파일러에 의해 시행되는 것보다 훨씬 좋습니다. "). 저의 일부는 C ++이 "this->"를 의무화하는 것으로 표준화하기를 바랍니다. 그러나 그것은 답이되는 것보다 토론의 세계로 가고 있습니다.

3
@LaurentCouvidou, 개발자가 접두사로 멤버 변수를 작성하도록 강요 할 수는 없습니다 m_.
SomeWritesReserved

94

에서 클린 코드 : 애자일 소프트웨어 장인의 수첩 이 접두사의 사용에 대한 명시 적 권고가있다 :

또한 멤버 변수에 m_더 이상 접두사를 지정할 필요가 없습니다. 클래스와 함수는 필요하지 않을 정도로 작아야합니다.

이것의 예 (C # 코드)도 있습니다 :

나쁜 습관 :

public class Part
{
    private String m_dsc; // The textual description

    void SetName(string name)
    {
        m_dsc = name;
    }
}

좋은 연습:

public class Part
{
    private String description;

    void SetDescription(string description)
    {
        this.description = description;
    }
}

우리는 명시 적 모호성 (의 경우 멤버 변수를 참조하는 언어 구조와 계산 , description멤버 및 description매개 변수) this.


6
"이 접두어의 사용법에 대해 명백한 권고가있을 수 있습니다."
Xofo

누군가가 그것을 썼기 때문에 너무 기뻐요
dmitreyg

또 다른 이유는 java getter / setter가 getName / setName으로 가정되므로 getM_name이 잘못되어 하나씩 처리해야하기 때문입니다.
레온

이것을 작성해 주셔서 감사합니다. 나는 당신이 인용 한 책이 2008 년 8 월 이후 출판되었다는 것을 지적하고 싶었습니다. 그리고 오늘도 새로운 코드 에서이 나쁜 습관을 발견합니다 (2019).
alexlomba87 '

20

C ++에서는 일반적인 관행입니다. C ++에서는 멤버 함수와 멤버 변수에 동일한 이름을 사용할 수없고 getter 함수는 종종 "get"접두사없이 이름이 지정되기 때문입니다.

class Person
{
   public:
      std::string name() const;

   private:
      std::string name; // This would lead to a compilation error.
      std::string m_name; // OK.
};

main.cpp:9:19: error: duplicate member 'name'
      std::string name;
                  ^
main.cpp:6:19: note: previous declaration is here
      std::string name() const;
                  ^
1 error generated.

http://coliru.stacked-crooked.com/a/f38e7dbb047687ad

"m_"은 "member"의 상태입니다. 접두사 "_"도 일반적입니다.

다른 규칙 / 문법을 사용하여이 문제를 해결하는 프로그래밍 언어에서는이 언어를 사용하지 않아야합니다.


11

m_접두사는 종종 멤버 변수에 사용되는 - 나는 그것의 주요 장점은 공용 속성과 개인 멤버 변수 뒷면이 사이에 명확한 구분을 만들 수 있다고 생각합니다 :

int m_something

public int Something => this.m_something; 

지원 변수에 대해 일관된 명명 규칙을 유지하는 데 도움이 될 수 있으며 m_접두사는이를 수행하는 한 가지 방법입니다. 대소 문자를 구분하지 않는 언어로 작동합니다.

이것이 얼마나 유용한지는 사용중인 언어와 도구에 따라 다릅니다. 강력한 리 팩터 툴과 인텔리전스를 갖춘 최신 IDE는 이와 같은 규칙이 필요하지 않으며,이를 수행 할 수있는 유일한 방법은 아니지만 어쨌든 실습을 인식하는 것이 좋습니다.


5
당신이 this.당신의 언어 로 작성해야한다면 , m_정말 쓸모가 없습니다.
Ruslan

@Ruslan은 속성과 백업 멤버 m_를 구별하는 것입니다 . 내가 선호하는 관습은 아니지만 VB와 같이 대소 문자를 구분하지 않는 언어에서 주로 사용되는 것을 보았습니다. this.Somethingthis.m_something
Keith

1
this.Something재산과 this.something후원을 위해? 아니면 this._something후원을 위해? this.m_something중복됩니다. 나는 _something타이핑 할 때 실수로 타이핑하지 않도록 Something멤버쉽과 관련이 있거나없는
것과 같이 사용합니다

@AustinWBryan은 대소 문자를 구분하지 않는 언어에 대한 이전 의견을 참조하십시오. 예, _접두사가 자체적으로 작동하지만 m_규칙입니다. 개인적으로 사용하는 것이 아니지만 코드에서 볼 때 저자의 의도였습니다.
Keith

7

다른 답변에서 언급했듯이 m_접두사는 변수가 클래스 멤버임을 나타내는 데 사용됩니다. 변수의 유형이 아니라 컨텍스트를 나타 내기 때문에 헝가리 표기법과 다릅니다.

m_C ++에서는 사용 하지만 'this'또는 'self'는 필수 인 다른 언어에서는 사용 하지 않습니다. C ++에서 'this->'가 코드를 어지럽히 기 때문에 사용되는 것을보고 싶지 않습니다.

또 다른 대답 m_dsc은 "나쁜 습관"과 "설명"입니다. "좋은 관행"이지만 약어에 문제가 있기 때문에 이것은 붉은 청어입니다.

또 다른 대답은 입력 this하면 IntelliSense가 팝업되지만 좋은 IDE에는 현재 클래스 멤버를 위해 IntelliSense를 팝업하는 단축키가 있습니다.


"그러나 이것은 청어입니다"-좋은 지적입니다. 공정한 비교는 m_descriptionvs description입니다.
전투

3

다른 많은 응답에서 언급했듯이 m_은 멤버 변수를 나타내는 접두사입니다. C ++ 세계에서 일반적으로 사용되었으며 Java를 포함한 다른 언어에도 전파되었습니다.

최신 IDE에서는 구문 강조 표시를 통해 어떤 변수가 로컬 이고 어떤 변수 가 멤버인지를 알 수 있으므로 완전히 중복됩니다 . 그러나 90 년대 후반에 구문 강조가 나타 났을 때,이 협약은 수년 동안 지속되어 왔으며 (적어도 C ++ 세계에서는) 확실하게 설정되었습니다.

어떤 자습서를 참조하는지 모르지만 두 가지 요소 중 하나 때문에 규칙을 사용하고 있다고 생각합니다.

  • 그것들은 m_ 규칙에 익숙한 사람들이 작성한 C ++ 튜토리얼입니다.
  • 구문 강조없이 일반 (단일 공백) 텍스트로 코드를 작성하므로 m_ 규칙은 예제를 더 명확하게하는 데 유용합니다.

예를 들면 다음과 같습니다. wiki.qt.io/How_to_Use_QSettings Qt Creator는 강조 표시를 사용하므로 첫 번째 추측이 나타날 수 있습니다. 조금 다른 점은 클래스의 개인 객체에 _object ()를 사용하고 포인터 인 경우 p_variable을 사용하는 또 다른 규칙 일 수 있습니다.
Ivanovic

3

Lockheed Martin은 특히 다른 사람의 코드를 읽을 때 사용할 수있는 3 접두사 명명 체계를 사용합니다.

   Scope          Reference Type(*Case-by-Case)   Type

   member   m     pointer p                       integer n
   argument a     reference r                     short   n
   local    l                                     float   f
                                                  double  f
                                                  boolean b

그래서...

int A::methodCall(float af_Argument1, int* apn_Arg2)
{
    lpn_Temp = apn_Arg2;
    mpf_Oops = lpn_Temp;  // Here I can see I made a mistake, I should not assign an int* to a float*
}

가치있는 것으로 가져 가십시오.


대박. "예제"에 감사드립니다. 실제로 유용한 위치는 200,000 줄의 코드를 편집 할 때입니다.
jiveturkey

1
방어 할 필요가 없습니다. 답변에 실수가 있음을 보여줌으로써 정직하게 도와 드리고자합니다. 5, 200000 줄의 코드가 있는지 여부는 중요하지 않습니다. 컴파일러는 호환되지 않는 포인터 유형으로 할당 할 수 없습니다. 따라서 의견에서 제시된 요점은 똥입니다.
Cássio Renan

방어적인 태도를 취하려는 것은 아닙니다. 죄송합니다.
jiveturkey

현대 언어에서는 이해가되지 않는 헝가리어 표기법의 변형입니다.
doc

2

현재 답변을 완성하고 질문이 언어에 국한되지 않기 때문에 일부 C- 프로젝트는 접두어 m_를 사용하여 파일과 g_관련된 전역 변수 및 정의 된 파일보다 범위가 큰 전역 변수를 정의합니다.
이 경우 접두사로 정의 된 전역 변수 m_ 는로 정의해야합니다 static.

이 규칙을 사용하는 프로젝트의 예는 EDK2 (UEFI 오픈 소스 구현) 코딩 규칙 을 참조하십시오 .


1

내가 아직 보지 못한 한 가지 주장은 'd macro' m_와 이름 충돌을 방지하기 위해 와 같은 접두사를 사용할 수 있다는 것 #define입니다.

검색 정규식 #define [a-z][A-Za-z0-9_]*[^(]/usr/include/term.h저주 / ncurses를에서.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.