inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

홍정모의 따라하며 배우는 C언어

16.6 #include와 헤더 파일

my_functions.h 파일 질문입니다

해결된 질문

601

it09kim

작성한 질문수 32

0

my_functions.h에서 

static int si = 0;

static int multiply(int a, int b) {

return a * b;

}

에서 두개 다 static을 빼면 컴파일이 안되던데 왜 그런지 잘 모르겠습니다

c

답변 7

2

안소

static이 붙지 않으면 extern 으로 간주됩니다. 전역변수들은 모두 extern 이기 떄문이에요. extern 을 생략할 수도 있구요.

static을 떼면 si 는 extern 변수가 되고, multiply 함수는 extern 함수가 됩니다.

근데 my_function.c 와 main.c 두군데에서 my_function.h 헤더 파일을 인클루딩 하고 있죠.

헤더파일을 인클루딩할 땐 헤더파일에 있는 모든 코드가 인클루딩한 곳으로 복사가 됩니다.

그러니 extern 변수, 함수인 si와  multiply 는 my_function.c 와 main.c 두군데에서 "정의"가 되는 것이나 마찬가지이기 때문에 에러가 발생하는 것이에요.

즉 동일한 범위 내에 동일한 이름의 변수와 함수를 정의해서 발생하는 에러와도 같다고 보시면 됩니다.

my_function.h 에서 정의를 하지 않고 그냥 선언만 하고 my_function.c 에서 정의를 해준다면 이렇게 중복 정의를 피할 수 있기 때문에 문제가 되지 않으실거에요.

// 아래와 같은 모습일 땐 문제 없음

// my_functions. h  (선언만)
int si;
int multiply(int a, int b);

// my_functions.c  (정의)
#include "my_functions.h"
int si = 0;
int multiply(int a, int b)
{
	return a * b;
}

1

안소

일단 제 환경에선 떼도 빌드 문제가 없고 어차피 static을 떼도 extern 처리 되기 때문에 별 문제 없을 것 같아서 저도 의아하고 잘 모르겠네요 ㅠㅠ

에러 메세지를 보니 두군데서 정의되서 그런 것 같은데 작성하신 main.cpp, my_functions.h, my_functions.cpp 코드 모두 다 주실 수 있을까요?

1

안소

static 떼도 잘 빌드 되는 것이 확인 되는데 의아하네요..!

일단 이 상황만 봐선 원인을 파악하기 힘드네요. 죄송합니다 ㅠㅠ 

좀 더 구체적인 설명과 강의 시간대 부탁드리겠습니다!

0

it09kim

감사합니다!! 이해되었어요 ㅎㅎ

0

it09kim

이건 에러메시지입니당,,ㅜ

0

it09kim

-main.c-

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include "my_functions.h"

#include "my_structures.h"

#include "my_macros.h"

extern int status;

int main()

{

#include "hello_world.h"

printf("PI = %f\n", PI);

printf("%p %d\n", &status, status);

print_status();

printf("%d\n", multiply(51, 2));

printf("main()\n");

printf("Static function address %p\n", multiply);

printf("Static variable address %p\n", &si);

print_address();

return 0;

}

- my_function.h - 

#pragma once

#include "my_functions.h"

extern int status;

int si = 0;

extern int add(int a, int b);

int multiply(int a, int b) {

return a * b;

}

// int subtract(int a, int b)

inline int subtract(int a, int b) {

return a - b;

}

void print_status();

void print_address();


-my_function.c-


#include "my_functions.h"

#include <stdio.h>

int status = 0;

int add(int a, int b) {

return a + b;

}

void print_status() {

printf("Address = %p, Value = %d\n", &status, status);

}

void print_address() {

printf("print_address()\n");

printf("Static function address %p\n", multiply);

printf("Static variable address %p\n", &si);

}

이렇게 교수님이랑 static 뺴곤 다 동일합니다 ㅜㅜ 왜이런지모르겠네요,,

0

it09kim

my_function.h에 있는 int multiply와 int si에서 static을 떼니까 _multiply already defined in main.obj
                              _si already defined in main.obj
                              one or more multiply defined symbols found 라고 링킹에러 뜨는데 왜이런지 모르겠네요 ㅜㅜ
static 떼도 잘 빌드되시나요?

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

47

3

main 함수에서 왜 int만 선언이 되는걸까요

1

53

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

53

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

46

1

프로토타입과 함수간의 인자 불일치

1

72

2

12.12 헤더 관련 질문

1

59

2

Visual Studio Community 2026 사용 문의

1

134

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

59

2

getchar(), putchar()

1

92

3

강의자리ㅛ

1

78

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

112

2

소스파일안에 여러 파일

1

74

2

F5와 F7의 차이

1

75

2

c = TWO * (a+b); 에서 a와 b는?

1

58

2

; 세미콜론을 붙이는 기준에 문의

1

68

1

Step over 기능 문의

1

52

2

2.6 강의 따옴표 출력 규칙 문의

1

74

2

int main 함수 관련 오류 문의

1

67

2

13.4 words[0]

0

60

2

11.7 함수를 구현해 봤습니다.

1

62

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

64

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

53

2

11.6 fit_str함수를 구현해 봤습니다.

1

53

2

11.5 코드 구현

1

67

2