2013-05-10 11 views
-2

에서 변수를 수출하는 것은, 내가 MAIN.CPP에서 사용하고자하는 즉시 사용 가능한 변수 (mtab 파일) :C/C++ : C/C++에서는 .H

  1. 선언 및 초기화
  2. 는 lib.cpp에서 구현 lib.h
내가이 일을 할 수 없습니다

: 무슨 일이야? typedef가 무시 된 것 같아요. 왜 그런지 모르겠습니다.

참고 : mtab 파일은 lib.h의 각 사용자에 대해 동일해야합니다으로

  1. , 나는
  2. 는 정적 변수는 항상 초기화해야 static 키워드를 추가 (예기치 않은 동작을 피하기 위해), I는 초기화 내가 lib.cpp에서 mtab 파일 선언과 초기화를 이동할 때 컴파일 KO
  3. 이며, MAIN.CPP에서 "통근"사용 : mtab 파일은 lib.h
  4. 에 나는 lib.cpp에 mtab 파일 초기화를 이동할 때 컴파일 KO입니다.
  5. 컴파일을 정상적으로 수행하는 유일한 방법은 mTab ​​선언 및 초기화를 main.cpp의 기본 범위 내에 두는 것입니다 ... 원하는 것은 아닙니다! (주 범위 편집 내부 OK입니다. 주요 범위 밖, 즉 수준을 포함에, 컴파일 KO입니다) 도움을

감사합니다,

FH

~>more * 

lib.cpp

#include "lib.h" 

void m1 (unsigned int const iDataSize, int * const iopData) { return; } 
void m2 (unsigned int const iDataSize, int * const iopData) { return; } 

lib.h

#ifndef __lib__ 
#define __lib__ 
void m1 (unsigned int const iDataSize, int * const iopData); 
void m2 (unsigned int const iDataSize, int * const iopData); 
typedef void (*pF) (unsigned int const iDataSize, int * const iopData); 
static pF mTab[2]; // Ready-to-use variable to be exported 
mTab[0] = &m1; 
mTab[1] = &m2; 
#endif 

MAIN.CPP

#include "lib.h" 
#include <stddef.h> // NULL 

int main() 
{ 
    (*mTab[0]) (0, NULL); 
    (*mTab[1]) (0, NULL); 

    return 0; 
} 

메이크

all: 
    gcc -I. -c lib.cpp -o lib.o 
    gcc -I. -c main.cpp -o main.o 
    gcc -I. lib.o main.o -o main.exe 

콘솔 :

~>make 
gcc -I. -c lib.cpp -o lib.o 
In file included from lib.cpp:1:0: 
lib.h:7:1: error: ‘mTab’ does not name a type 
lib.h:8:1: error: ‘mTab’ does not name a type 
make: *** [all] Error 1 
+0

스택 오버플로가 개인 교습을위한 장소가 아니므로 아래 표를 얻고 있습니다. 당신은 정상적인 학습을 위해 다른 출처를 사용해야합니다. Stack Overflow는 이미 주제를 많이 습득 한 사람들을 모으는 질문과 문제에 더 잘 사용됩니다. –

답변

1
mTab[0] = &m1; 

당신은 그 글로벌 네임 스페이스를 할 수 없습니다. cpps 중 하나에서 정의하고 헤더에서 'extern'으로 사용하십시오.

0

static은이 컨텍스트에서 다른 것을 의미합니다. static은 변수에 내부 링크가 있음을 나타냅니다. 즉, 컴파일 단위마다 별도의 변수가 존재합니다. 헤더에 extern을 사용하고 싶습니다.

또한 포함 보호를 위해 __lib__ 이외의 다른 기호를 선택하십시오. 이중 밑줄을 포함하는 식별자는 구현 용도로 예약되어 있습니다.

마지막으로 ahoka가 표시된 바와 같이 해당 코드를 네임 스페이스 범위에 배치 할 수 없습니다. 그것은 함수에서만 유효합니다. 그렇게하려면 다음과 같이하십시오.

lib.시간

extern pF mTab[2]; 

lib.cpp

pF mTab[2] = {&m1, &m2}; 
+0

이 작업 중입니다! 덕분에 –

6

첫째, 전용 공유 헤더 파일의 선언, 개체 또는 기능을하지 정의를 넣어. mTab의 경우 lib.h에서 다음을 사용하십시오.

extern pF mTab[2]; 

둘째, 하나의 소스 파일에 개체를 정의하십시오. lib.cpp이 넣어 :

pf mTab[2] = { m1, m2 }; 

셋째, mTab[0] = &m1;는 mtab 파일의 초기화되지 않습니다. 할당 문이지만 파일 범위에 할당 문을 사용할 수 없기 때문에 잘못된 위치에 있습니다. mTab을 초기화하는 올바른 방법은 위에 나와 있습니다. 할당은 실행 문이며 실행 본문에 있어야하며 초기화는 프로그램의 기본 실행 이전에 발생할 수있는 개체 생성의 일부입니다.

넷째, static은 초기화되지 않습니다. 개체를 각 사용자마다 동일하게 만듭니다. 두 가지 효과가 있는데, 사용되는 위치에 따라 다를 수 있습니다. 파일 범위에서 사용되는 경우 식별자에 내부 연결이 있습니다. 즉 식별자가 현재 컴파일의 객체에 인 을 나타냅니다. 이 아닌은 다른 컴파일의 동일한 식별자에 외부 적으로 연결됩니다. 그래서 그것은 실제로 여러분이 쓴 것과 반대입니다. 그것은 각 소스 파일이 mTab을 공유하지 않고 자신의 mTab을 가짐을 의미합니다. 정적 static의 두 번째 효과는 객체에 정적 저장 기간을 부여하기 때문에 수명이 프로그램의 전체 실행이지만 파일 범위에서 선언 된 객체는 기본적으로 정적 저장 기간을 갖기 때문에 파일 범위에는 아무런 영향을 미치지 않습니다.)

+0

선언문에서 배열 크기를 제외하고 extern pF mTab ​​[]'에 남겨 둘 수 있습니다. 물론이 배열의 사용자에게 최대 크기를 알려주는 것이 유용 할 것이므로 경계를 벗어나지 않도록하십시오. – Arne