2010-03-15 5 views
1

이러한 내 오류입니다 :C 컴파일 오류

error: static declaration of doct follows non-static declaration
error: previous declaration of doct was here.

그리고 내 코드는 다음과 같습니다

int doct(int*); /* <- Second error points here */ 

private int doct(int *a) 
    { 
    static int a=0; /* First error points here */ 
    a++; 
    *a=a; 
    return 0; 
    } 

어떤 제안?

void foo(void); 

static void foo(void) {} 

모두에서 제거 또는 두 가지 모두에 추가하여 중, 모두 static 일치하는지 확인 : 함수 같은, 다음 정적 정의, 비 정적으로 선언 할 때

+4

아마도 일부 소스 코드를 게시하면 도움이 될까요? – Extrakun

+0

출처는 어디입니까? 나는 그것에 대해 많이 말할 수 없다. –

+2

제안 : 오류가 무엇을 의미하는지 알 수 있도록 일부 코드를 게시하십시오. 이것은 우리가 "결과가 12, 방정식은 무엇입니까?"라고 묻는 것과 다르지 않습니다. – GManNickG

답변

2

이 오류가 발생합니다. static의 기능을 이해하십시오.

기능이 static으로 표시된 경우 해당 번역 단위에만 표시됩니다. 귀하의 경우 선언에 "이 함수는 비 정적으로 사용할 수 있습니다."라는 정적 인 의미는 없지만 정적으로 정의 할 수 있습니다.


다른 오류가 있습니다. 함수의 a은 매개 변수 목록에서 a을 숨 깁니다. 다른 이름을 지정해야합니다. 해당 범위에서 a은 포인터가 아니고 정수이므로 *a = a은 작동하지 않습니다. 정수에는 counter과 같은 설명이 포함 된 이름을 사용하십시오.

+0

하지만 내 함수에는 정적 키워드가 없습니다. – ambika

+2

@ambika : 당신은'비공개'를 가지고 있습니다. 'private'은 C 언어의 일부가 아니기 때문에 다른 것을 줄 수는 없습니다. 그래도 오류를 생성하려면'private' 매크로가'static' 매크로 여야합니다. 그것은 : #define private static'입니다. 따라서 선언문에 "private"을 넣거나 정의에서 "private"을 제거하십시오. 혼란 스럽기 때문에'private' 대신'static'을 사용하는 것이 좋습니다. (이 질문에 대한 응답을보십시오.) – GManNickG

+0

GMAN 감사합니다. 나는 그것을 해결한다. – ambika

3

프로토 타입은 실제 기능과 일치해야합니다. 당신은하지 않습니다 : 또한 private가의 일부가 아님을 명심해야

int doct (int *a) 

:

int doct(int*); 
private int doct (int *a) 

하나가 프로토 타입 변경 :

private int doct(int*); 

를하거나 기능을 변경 C 언어를 사용하지만 사람들은 정적을 대체하기 위해이를 종종 사용합니다. 이 라인에 의해 가능하게 할 수 있습니다

#define private static 

당신이 private 이름을 사용하는 곳이 매크로 활성화해야되는 유일한 단서와 함께. 프로토 타입에서 작동하지 않는다면 그 시점에서 정의되지 않았기 때문일 수 있습니다. 내 충고는 모두 private을 떼어 놓고 정적을 사용하는 것입니다 (사실 private이 정의 된 경우). 사람들은 언어를 배우고, 불필요한 목발을 채택하지 않아야합니다 (제 생각에는). 나는 또한 경멸

다른 즐겨 찾기는 다음과 같습니다

#define global extern 
#define begin { 
#define end } 

privateglobal 각각 모든 파일에이 파일을 로컬 및 글로벌 의미하는 데 사용됩니다.beginend은 그 문제뿐만 아니라 :-)

속하는 파스칼로 돌아 가야 사람들, 특히 불쾌한 가증 한, 당신의 라인은 다음과 같습니다

static int a = 0; 

것입니다 실제로 숨기기 매개 변수가 (동일한 이름이므로) 함수에 전달하면

*a = a; 

(다른 유형이기 때문에) 오류가 발생합니다. 그렇게하는 것이 거의 불가능합니다. 둘 중 하나의 이름을 변경하십시오.

+0

i make int doct (int *); to private int doct (int *); 작동하지 않습니다. – ambika

+0

"작동하지 않는다"는 것은 무엇을 의미합니까? 당신의 선언문이 헤더에 있었는데 아마도 작동하지 않을 것입니다. 헤더에 있습니까? – GManNickG

+1

처음에는 "비공개"키워드가 의미하는 바를 알고 싶습니다. :) –