2012-02-23 1 views
7

이것은 쉬운 질문이 될 것이지만 주위를 인터넷으로 검색하는 것은 대답을 제공하지 않는 것 같습니다. C에서 그것을 이해하는 방법은 foo가 구조체 일 때 foo 객체를 초기화하는 두 가지 방법이 있습니다. 예를 들어 아래의 코드를보십시오C 구조체를 초기화 할 때의 용어

typedef struct foo 
{ 
    int var1; 
    int var2; 
    char* var3; 
}foo; 

//initializes and allocates a foo 
foo* foo_init1(int v1,int v2,const char* v3) 
{ 
    if(..some checks..) 
     return 0; 
    foo* ret = malloc(sizeof(foo)); 

    ret->var1 = v1; 
    ret->var2 = v2; 
    ret-var3 = malloc(strlen(v3)+1); 
    strcpy(ret->var3,v3); 

    return ret; 
} 

// initializes foo by ... what? How do we call this method of initialization? 
char foo_init2(foo* ret,int v1,int v2, const char* v3) 
{ 
    //do some checks and return false 
    if(...some checks..) 
     return false//;assume you defined true and false in a header file as 1 and 0 respectively 
    ret->var1 = v1; 
    ret->var1 = v1; 
    ret->var2 = v2; 
    ret-var3 = malloc(strlen(v3)+1); 
    strcpy(ret->var3,v3); 

    return true; 
} 

그래서 내 질문은 이것입니다. 어떻게 C에서 다른 초기화 메소드를 참조 할 수 있습니까? 첫 번째는 초기화 된 포인터가 당신이 그런 힙에 foo는 개체를 원하는 경우 쉽게 사용할 수 있도록 foo를 위해 반환

foo* f1 = foo_init1(10,20,"hello"); 

을하지만 두 번째는 foo는 필요 .. 어떻게? 아래 코드를 살펴보십시오.

foo f1; 
foo_init2(&f1,10,20,"hello"); 

두 번째 방법은 스택에서 개체를 쉽게 초기화 할 수 있지만 어떻게 호출합니까? 이것은 기본적으로 내 질문입니다, 초기화의 두 번째 방법을 참조하는 방법.

첫 번째 것은 foo에 대한 포인터를 할당하고 초기화합니다. 두 번째 것은 foo를 초기화합니다 ... 뭐라 구요? 참고?

보너스 질문으로 C로 코딩 할 때 어떻게 일합니까? 당신이 만들고있는 객체의 사용법을 결정하고 그것을 통해 type1, 또는 2 또는 둘 다 초기화 함수를 가져야하는지 결정합니까? 모든 웰 두 방법에 대한 용어가 정의 된 경우

+1

저는 할당하는 사람에게'_new'를, 그렇지 않은 사람을 위해'_init'라고 부릅니다. 또한,'_new'가 내부적으로'_init'을 호출하여 코드를 쉽게 유지 보수 할 수있게하십시오. (가끔은'_nake' 대신에'_make'라고 부릅니다.) –

+0

크리스 (Chris)는 전화하는 방식에 대해 좋은 통찰력을 가지고 있습니다. 투표를 할 수 있도록 답변을하지 않으시겠습니까? 또한 같은 질문을 가진 잠재 고객이 볼 수 있도록 해주세요. 또한 ... 사람들이 그들을 참조 할 수있는 표준 방법이 있습니까? 함수 이름 옆에있는 다른 사용법을 즉시 이해할 수있는 누군가 내 코드를보고 싶습니다. ( – Lefteris

+1

) @ChrisLutz : 타입 이름에'_new','_init'를 추가하면됩니다. foo_new','foo_init')? 그렇지 않으면 구현에 예약 된 식별자와 충돌하게됩니다. (이 사실을 알고 있으리라 확신하지만, 그렇지 않을 수도 있습니다.) –

답변

1

의견에있는 사람들 중 누구도 의견을 답변으로 바꾸려는 제안을 채택하지 않아서 내 자신의 질문에 대답해야합니다.

기본적으로 가능한 대답은 AI가 명시한대로 특정 명명 규칙이 없다는 것입니다. 물론 사용하는 어떤 이름 지정 방법, 그것은해야한다 :

  • 일관된를 프로젝트/S의 모든 걸쳐 명확성
  • 인식 할 것이 실제로 무엇을하는지 수행하는 기능과 같은 다른 프로그래머 .

의견을 제시하기 위해 몇 가지 훌륭한 권고 사항이있었습니다.들어 foo는 개체가있을 때 :

  • 함수 내부 초기화 통과 : foo_init
  • 함수 내에서 할당하고 포인터가 반환 : foo_alloc, foo_makefoo_new

위의 내용은 모두 명확합니다. 그러나 무엇이 일어나고 있는지 가장 정확하게 설명하고 있습니다. 함수에서 foo_initfoo_alloc이됩니다.

개인적으로 _alloc 솔루션은 내 코드에서 어떻게 보이는지 싫어하기 때문에 _create 대신 _create를 alloc 함수 대신 추가하여 함수를 나타내는 것으로 나타냅니다.

하지만 답은 내가 개인적으로 선호하는 것입니다. 기능의 기능이 그 이름을 읽음으로써 분명히 밝혀지면 모두 괜찮아야합니다.

2

I 함수 동적 구조를 할당하고, 부재에 값을 할당하는 첫 번째 방법에서
,
제의 구조는 이전에 할당되지만, 모르겠습니다 함수를 호출하고 함수는 멤버에게 값을 할당합니다.

당신이 만들고있는 객체의 사용법을 결정하고 그로 인해 type1 또는 2 또는 둘 다 초기화 기능이 있어야하는지 결정합니까?

선택하면 첫 번째 또는 두 번째 방법은 중요한 차이에 따라 달라집니다 당신이 범위에서 반환 된 구조를 전달해야 할 때
이 첫 번째 방법이 바람직하고, 힙의 메모리는 데이터가 동안을 우선하는 명시 적 전까지 해제해야합니다 두 번째 메서드에서는 전달 된 개체의 범위가 끝나면 스택의 데이터가 제거됩니다.

+0

답변을 주셔서 고마워요. 두 가지 방법의 차이점을 알고 있으므로 내 질문에 당신이 말하면 ... 당신이 마지막 단락에서 말한 것을 모두해야합니다. 둘 다 초기화 함수를 사용하고 적절할 때 각각을 사용할 수 있습니까? 또한 영어 원어민이 아니기 때문에 두 번째 기능의 이름을 지정하기 만하면됩니다.이것이 제가 코드베이스에서 함수의 이름을 짓기를 원했기 때문에 질문을 한 주된 이유입니다. – Lefteris