헤더에 extern?

moonzoo의 이미지

헤더에 Global function을 선언할때

extern 키워드를 사용하는 것과

그냥 함수 선언만 하는 것중에

어떤 것이 바람직한가요?

for1003의 이미지

C에서 말씀하시는 건가요?

C에서 사용되는 함수는 전역 함수 밖에 없습니다.
함수 선언 할때 암것도 안 붙여도 extern이 붙은 것으로 간주합니다.
차이 없습니다.

danielkim의 이미지

좀 수정되어야 하는 부분이 있어 말씀드립니다.

C에서 사용되는 함수는 전역 함수 밖에 없습니다.

C에서 전역 함수 외에 static 함수라는 것도 있습니다.
함수 앞에 명시적으로 static이라고 적어야 겠지요

서지훈의 이미지

danielkim wrote:
좀 수정되어야 하는 부분이 있어 말씀드립니다.

C에서 사용되는 함수는 전역 함수 밖에 없습니다.

C에서 전역 함수 외에 static 함수라는 것도 있습니다.
함수 앞에 명시적으로 static이라고 적어야 겠지요


저도 이놈은 본지는 꽤 됐는데...
써먹어 본지적이 없어서...^^
괜히 함수 만들어 났는데...
static으로 마근ㄴ 다는게 어째 좀...-_-ㅋ
전 항상... 기본 디폴트로 사용하고 있습니다...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

for1003의 이미지

에구.. static 함수를 생각 못했군여...
제가 기본이 안된것이겠죠.. ^^;;

C에서 사용되는 함수는 일반 전역 함수 하고, static 전역 함수 2가지가 있습니다.
일반 전역 함수는 제가 위에서 말씀드렸던것 처럼 외부 모듈에서 호출이 가능하도록 extern이 붙든 안붙든 extern이 붙은 것으로 간주합니다.
extern 붙여 쓰는것은 명시적으로 가독성을 높여주긴 하겠지만 여기선 붙이든 안 붙이든 별 의미가 없어 보입니다.

참고로 static 전역 함수는 모듈내에서만 호출 가능하게 하기 위해서 사용합니다.

dondek의 이미지

하나의 파일에만 그 함수가 호출된다면 그 파일내에서 static으로 선언하는 것이 속도가 약간 빠르답니다.

진리를 나의 수준으로 끌어내리지 마라.
나를 진리의 수준으로 끌어올려라. - 배꼽 중에서

Dr_stein의 이미지

다른 모듈에서 쓰는지 모르고 같은 이름의 함수를 정의해버리면..
어떻게 되는건가요?? (그런경우는 없었지만서도...)

글로벌한 용도 아니면 static이라고 명시적으로 써주는게
좋지 않을까요???

앞마당 먹고 시작한 저그의 8할은 뮤탈 테크를 먼저 탄다. 하지만 나머지 2할때문에 항상 스켄이 모자란다. - _-;

방준영의 이미지

Dr_stein wrote:
다른 모듈에서 쓰는지 모르고 같은 이름의 함수를 정의해버리면..
어떻게 되는건가요?? (그런경우는 없었지만서도...)

C 컴파일러가 알려줍니다.
yielding의 이미지

여담으로 c++에서는 함수 앞에 static은 deprecate되었고
anonymous namespace를 씁니다.

namespace {
void ex_static_f() {

}

}

Life rushes on, we are distracted

tifler의 이미지

dondek wrote:
하나의 파일에만 그 함수가 호출된다면 그 파일내에서 static으로 선언하는 것이 속도가 약간 빠르답니다.

scope는 namespace의 고갈을 막고,
모듈화를 시행하기 위해서 사용되는것으로 속도와는 무관합니다.
실제 컴파일을 해보면 아래와 같이 동일한 code를 생성하게 됩니다.

static int local(void)
{
	return 0;
}

int main()
{ 
	return local(); 
}

//============================

.globl main
	.type	 main,@function
main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$8, %esp
	call	local
	movl	%eax, %eax
	movl	%eax, %eax
	movl	%eax, %eax
	leave
	ret

//============================
int global(void)
{
	return 0;
}

//============================
extern int global(void);

int main()
{ 
	return global(); 
}

//============================

.globl main
	.type	 main,@function
main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$8, %esp
	call	global
	movl	%eax, %eax
	movl	%eax, %eax
	movl	%eax, %eax
	leave
	ret

/***********************
* while(1) sleep(INFINITE);
***********************/

서지원의 이미지

scope는 namespace의 충돌을 막고, 모듈화를 위해 사용하는 것이 맞지만, 속도와 전혀 무관하지는 않습니다.

함수가 static으로 선언되어 있고, static 하게 사용한다면, 컴파일러가 우선적으로 optimization을 하게 됩니다. gcc에서는 -O3 (혹은 -finline-functions) 로 컴파일 하게 되는 경우에, output이 다릅니다.
사실 생각해 보면, 컴파일러에게 뭔가 정보를 더 주었기 때문에, 뭔가 좀 더 최적화되는 것이 당연한 것 같기도 합니다.

그렇지만 어쨋건 static keyword는 속도 보다는 modularity를 위한 것임이 분명합니다.

moonzoo의 이미지

윗 분들의 답변에 감사드립니다.

여러분의 의견을 참고해서

일단 저는 헤더에 그냥 선언!? 대신에

extern선언을 사용하는 방향으로 잡았습니다.

각각의 .c파일에도 외부의 필요한 함수는 extern으로 선언했습니다.

하나의 함수에 대해서..

.h와 .c에 2개의 extern 선언이 생기는 모양이 돼서..고민이 됐는데..

.h에는 관리의 명확성을 위해서,

.c에는 외부 모듈임을 분명히 알리고자 썼습니다.
(프로토 타입을 보기 위해 .h를 뒤져야 불편을 막기위해서도..)

그 외의 .c의 함수들은 static 으로 잡았구여..

scope 를 생각하면서 정리해 보니 한결 코드가 알아 보기 편해진 것 같습니다.

자주 코치 부탁드리겠습니당 ^^

tifler의 이미지

우선 moonzoo님 축하드립니다. 한단계 업을 하고 계시는듯 하네요 ^^

주제와 다른부분에서, 본의 아니게 논쟁이 될 소지의 글을 남겼네요...

마무리 하고자 마지막으로 몇자만 적도록 하겠습니다.

서지원 wrote:
scope는 namespace의 충돌을 막고, 모듈화를 위해 사용하는 것이 맞지만, 속도와 전혀 무관하지는 않습니다.

함수가 static으로 선언되어 있고, static 하게 사용한다면, 컴파일러가 우선적으로 optimization을 하게 됩니다. gcc에서는 -O3 (혹은 -finline-functions) 로 컴파일 하게 되는 경우에, output이 다릅니다.
사실 생각해 보면, 컴파일러에게 뭔가 정보를 더 주었기 때문에, 뭔가 좀 더 최적화되는 것이 당연한 것 같기도 합니다.

그렇지만 어쨋건 static keyword는 속도 보다는 modularity를 위한 것임이 분명합니다.

맞습니다. gcc manual상에는 그렇게 되어 있습니다.

그렇지만 한가지 짚고 넘어가야 할 것이 있습니다.

제가 말씀드릴려고 한 것은 static keyword자체에 대한 내용입니다.

C99상에 명시된 바로는 static keyword는 storage-class-specifier입니다.

inline과 static이 결합하여 optmization된 결과, 다른 어셈블러를 내놓는다는것은
gcc의 구현에서 표준 이외에 추가된 내용입니다.

모든 컴파일러에서 속도와 관련이 된다고 정의 하기에는 오류가 있습니다.

그러기에 주제넘을지 몰라도 표준을 따라 속도와 무관하다고 단정을 한것입니다.

사람마다 다르겠지만, 기본이 우선이라고 사려되는바 몇자 적었습니다.
딴지라고 생각지 마시길 바랍니다.

서로의 시간과 정열을 아끼고자 저는 이것으로 마무리 하렵니다.
답변도 한번으로 해 주셨으면 합니다.

/***********************
* while(1) sleep(INFINITE);
***********************/

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.