C에서 사용되는 함수는 일반 전역 함수 하고, static 전역 함수 2가지가 있습니다.
일반 전역 함수는 제가 위에서 말씀드렸던것 처럼 외부 모듈에서 호출이 가능하도록 extern이 붙든 안붙든 extern이 붙은 것으로 간주합니다.
extern 붙여 쓰는것은 명시적으로 가독성을 높여주긴 하겠지만 여기선 붙이든 안 붙이든 별 의미가 없어 보입니다.
scope는 namespace의 충돌을 막고, 모듈화를 위해 사용하는 것이 맞지만, 속도와 전혀 무관하지는 않습니다.
함수가 static으로 선언되어 있고, static 하게 사용한다면, 컴파일러가 우선적으로 optimization을 하게 됩니다. gcc에서는 -O3 (혹은 -finline-functions) 로 컴파일 하게 되는 경우에, output이 다릅니다.
사실 생각해 보면, 컴파일러에게 뭔가 정보를 더 주었기 때문에, 뭔가 좀 더 최적화되는 것이 당연한 것 같기도 합니다.
그렇지만 어쨋건 static keyword는 속도 보다는 modularity를 위한 것임이 분명합니다.
scope는 namespace의 충돌을 막고, 모듈화를 위해 사용하는 것이 맞지만, 속도와 전혀 무관하지는 않습니다.
함수가 static으로 선언되어 있고, static 하게 사용한다면, 컴파일러가 우선적으로 optimization을 하게 됩니다. gcc에서는 -O3 (혹은 -finline-functions) 로 컴파일 하게 되는 경우에, output이 다릅니다.
사실 생각해 보면, 컴파일러에게 뭔가 정보를 더 주었기 때문에, 뭔가 좀 더 최적화되는 것이 당연한 것 같기도 합니다.
그렇지만 어쨋건 static keyword는 속도 보다는 modularity를 위한 것임이 분명합니다.
C에서 말씀하시는 건가요?
C에서 말씀하시는 건가요?
C에서 사용되는 함수는 전역 함수 밖에 없습니다.
함수 선언 할때 암것도 안 붙여도 extern이 붙은 것으로 간주합니다.
차이 없습니다.
위의 답변내용중 ... ..
좀 수정되어야 하는 부분이 있어 말씀드립니다.
C에서 사용되는 함수는 전역 함수 밖에 없습니다.
C에서 전역 함수 외에 static 함수라는 것도 있습니다.
함수 앞에 명시적으로 static이라고 적어야 겠지요
Re: 위의 답변내용중 ... ..
저도 이놈은 본지는 꽤 됐는데...
써먹어 본지적이 없어서...^^
괜히 함수 만들어 났는데...
static으로 마근ㄴ 다는게 어째 좀...-_-ㅋ
전 항상... 기본 디폴트로 사용하고 있습니다...
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
에구.. static 함수를 생각 못했군여...제가 기본이 안된것이겠
에구.. static 함수를 생각 못했군여...
제가 기본이 안된것이겠죠.. ^^;;
C에서 사용되는 함수는 일반 전역 함수 하고, static 전역 함수 2가지가 있습니다.
일반 전역 함수는 제가 위에서 말씀드렸던것 처럼 외부 모듈에서 호출이 가능하도록 extern이 붙든 안붙든 extern이 붙은 것으로 간주합니다.
extern 붙여 쓰는것은 명시적으로 가독성을 높여주긴 하겠지만 여기선 붙이든 안 붙이든 별 의미가 없어 보입니다.
참고로 static 전역 함수는 모듈내에서만 호출 가능하게 하기 위해서 사용합니다.
하나의 파일에만 그 함수가 호출된다면 그 파일내에서 static으로 선언
하나의 파일에만 그 함수가 호출된다면 그 파일내에서 static으로 선언하는 것이 속도가 약간 빠르답니다.
진리를 나의 수준으로 끌어내리지 마라.
나를 진리의 수준으로 끌어올려라. - 배꼽 중에서
다른 모듈에서 쓰는지 모르고 같은 이름의 함수를 정의해버리면..어떻게
다른 모듈에서 쓰는지 모르고 같은 이름의 함수를 정의해버리면..
어떻게 되는건가요?? (그런경우는 없었지만서도...)
글로벌한 용도 아니면 static이라고 명시적으로 써주는게
좋지 않을까요???
앞마당 먹고 시작한 저그의 8할은 뮤탈 테크를 먼저 탄다. 하지만 나머지 2할때문에 항상 스켄이 모자란다. - _-;
[quote="Dr_stein"]다른 모듈에서 쓰는지 모르고 같은 이름의
C 컴파일러가 알려줍니다.
한국 BSD 사용자 포럼
여담으로 c++에서는 함수 앞에 static은 deprecate되었고
여담으로 c++에서는 함수 앞에 static은 deprecate되었고
anonymous namespace를 씁니다.
namespace {
void ex_static_f() {
}
}
Life rushes on, we are distracted
[quote="dondek"]하나의 파일에만 그 함수가 호출된다면 그 파
scope는 namespace의 고갈을 막고,
모듈화를 시행하기 위해서 사용되는것으로 속도와는 무관합니다.
실제 컴파일을 해보면 아래와 같이 동일한 code를 생성하게 됩니다.
/***********************
* while(1) sleep(INFINITE);
***********************/
scope는 namespace의 충돌을 막고, 모듈화를 위해 사용하는 것
scope는 namespace의 충돌을 막고, 모듈화를 위해 사용하는 것이 맞지만, 속도와 전혀 무관하지는 않습니다.
함수가 static으로 선언되어 있고, static 하게 사용한다면, 컴파일러가 우선적으로 optimization을 하게 됩니다. gcc에서는 -O3 (혹은 -finline-functions) 로 컴파일 하게 되는 경우에, output이 다릅니다.
사실 생각해 보면, 컴파일러에게 뭔가 정보를 더 주었기 때문에, 뭔가 좀 더 최적화되는 것이 당연한 것 같기도 합니다.
그렇지만 어쨋건 static keyword는 속도 보다는 modularity를 위한 것임이 분명합니다.
..
윗 분들의 답변에 감사드립니다.
여러분의 의견을 참고해서
일단 저는 헤더에 그냥 선언!? 대신에
extern선언을 사용하는 방향으로 잡았습니다.
각각의 .c파일에도 외부의 필요한 함수는 extern으로 선언했습니다.
하나의 함수에 대해서..
.h와 .c에 2개의 extern 선언이 생기는 모양이 돼서..고민이 됐는데..
.h에는 관리의 명확성을 위해서,
.c에는 외부 모듈임을 분명히 알리고자 썼습니다.
(프로토 타입을 보기 위해 .h를 뒤져야 불편을 막기위해서도..)
그 외의 .c의 함수들은 static 으로 잡았구여..
scope 를 생각하면서 정리해 보니 한결 코드가 알아 보기 편해진 것 같습니다.
자주 코치 부탁드리겠습니당 ^^
우선 moonzoo님 축하드립니다. 한단계 업을 하고 계시는듯 하네요 ^
우선 moonzoo님 축하드립니다. 한단계 업을 하고 계시는듯 하네요 ^^
주제와 다른부분에서, 본의 아니게 논쟁이 될 소지의 글을 남겼네요...
마무리 하고자 마지막으로 몇자만 적도록 하겠습니다.
맞습니다. gcc manual상에는 그렇게 되어 있습니다.
그렇지만 한가지 짚고 넘어가야 할 것이 있습니다.
제가 말씀드릴려고 한 것은 static keyword자체에 대한 내용입니다.
C99상에 명시된 바로는 static keyword는 storage-class-specifier입니다.
inline과 static이 결합하여 optmization된 결과, 다른 어셈블러를 내놓는다는것은
gcc의 구현에서 표준 이외에 추가된 내용입니다.
모든 컴파일러에서 속도와 관련이 된다고 정의 하기에는 오류가 있습니다.
그러기에 주제넘을지 몰라도 표준을 따라 속도와 무관하다고 단정을 한것입니다.
사람마다 다르겠지만, 기본이 우선이라고 사려되는바 몇자 적었습니다.
딴지라고 생각지 마시길 바랍니다.
서로의 시간과 정열을 아끼고자 저는 이것으로 마무리 하렵니다.
답변도 한번으로 해 주셨으면 합니다.
/***********************
* while(1) sleep(INFINITE);
***********************/
댓글 달기