C 표준에서 _, __로 시작하는 이름은 구현체(implementation)에 의해 예약되어 있기 때문입니다. 예를 들어 컴파일러 제작자가 표준 라이브러리에서 _strcpy란 이름의 함수를 내부적으로 사용하고 있다고 칩시다. 그러면 사용자가 _strcpy라는 이름을 사용한다면 문제가 생길 수 있습니다.
strcpy를 _strcpy로 쓰건 말건 그건 컴파일러에 따라 다 다를 수 있습니다. 하지만 일반적으로 컴파일러에서 _나 __로 시작하는 identifier들을 내부적인 목적으로 많이 사용하고 심지어 extension으로 사용하는 경우도 있기 때문에 충돌을 방지하기 위해서는 다른 prefix를 쓰는 게 좋겠지요. 안 나올 거라는 확신이 있다면 그냥 쓰셔도 상관은 없습니다 :) (실제로 저는 _<progname>_로 시작하는 prefix를 종종 쓰곤 합니다.)
- 그 외의 미리 정의된 매크로(predefined macro) 이름들은 밑줄문자 다음에 대문자(e.g. _Tag)로 시작하거나 __로 시작하여야 한다. (C99 6.10.8)
- 밑줄문자 다음에 대문자로 시작하거나 __로 시작하는 모든 identifier들은 특정 목적을 위해 미리 예약되어 있다. (C99 7.1.3)
- _로 시작하는 식별자들은 파일 스코프를 갖는 변수 이름, 함수 이름, 숫자상수 이름이나 태그 네임을 위해 미리 예약되어 있다. (C99 7.1.3)
C 표준에서 _, __로 시작하는 이름은 구현체(implementatio
C 표준에서 _, __로 시작하는 이름은 구현체(implementation)에 의해 예약되어 있기 때문입니다. 예를 들어 컴파일러 제작자가 표준 라이브러리에서 _strcpy란 이름의 함수를 내부적으로 사용하고 있다고 칩시다. 그러면 사용자가 _strcpy라는 이름을 사용한다면 문제가 생길 수 있습니다.
구현체라면...
실제 제공되는 라이브러리에서는 strcpy로 알고 쓰고 있지만 내부적인 표현과 실제 구현은 _strcpy 이런식으로 사용된다는 말인가요?
어떤 소스를 보면 특별히 이런 함수를 많이 이용하는 소스도 있는 것같던데.. (프로그래머가 만든건지 제공되는 라이브러리인지는 모르겟지만..)
이런식의 구현이 어떤 장점이 있는걸까요?
그립다는 것은 아직도 네가 내 안에 남아 있다는 뜻이다.
그립다는 것은 지금은 너를 볼 수 없다는 뜻이다.
볼 수는 없지만 보이지 않는 내 안 어느 곳에 네가 남아 있다는 뜻이다.
-이정하의 《혼자 사랑한다는 것은》중에서-
> 실제 제공되는 라이브러리에서는 strcpy로 알고 쓰고 있지만
> 실제 제공되는 라이브러리에서는 strcpy로 알고 쓰고 있지만 내부적인 표현과 실제 구현은 _strcpy 이런식으로 사용된다는 말인가요?
아닙니다. 확대 해석하지 말고 제대로 읽어 주십시오.
_, __로 시작하는 이름은 컴파일러 제작자가 사용하는 것이 일종의 관례입니다. 프로그래머가 _, __로 시작하는 이름을 사용할 경우 컴파일러 제작자가 내부적으로 사용하는 이름과 충돌할 가능성이 커집니다.
> 이런식의 구현이 어떤 장점이 있는걸까요?
보통 _, __로 시작하는 이름을 사용하는 이유는 충돌 가능성이 적은 이름을 만들기 위해서 입니다. 그렇다면 꼭 _, __로 시작하는 이름이 아니라도 상관이 없습니다. t_ 라던가 120894_ 라던가 아니면 이름 앞이 아니라 뒤에 _, __를 붙이는 방법도 있겠지요.
아하~
^^a
그립다는 것은 아직도 네가 내 안에 남아 있다는 뜻이다.
그립다는 것은 지금은 너를 볼 수 없다는 뜻이다.
볼 수는 없지만 보이지 않는 내 안 어느 곳에 네가 남아 있다는 뜻이다.
-이정하의 《혼자 사랑한다는 것은》중에서-
역시 __ 로는 아무리 검색해도 안나오는군요.제 기억에 관련 쓰레드가
역시 __ 로는 아무리 검색해도 안나오는군요.
제 기억에 관련 쓰레드가 몇개 있었던것 같은데 말이죠....
http://bbs.kldp.org/viewtopic.php?t=58147
여기 보시면 그 부분에 대해서 나오는듯 합니다.
nohmad님 링크 읽어보시면 설명되있습니다만...영업니다 :wink:
내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.
[quote="Anonymous"]t_ 라던가 120894_ 라던가...
딴지는 아니지만 120894_면 identifier가 안 되겠군요... :)
strcpy를 _strcpy로 쓰건 말건 그건 컴파일러에 따라 다 다를 수 있습니다. 하지만 일반적으로 컴파일러에서 _나 __로 시작하는 identifier들을 내부적인 목적으로 많이 사용하고 심지어 extension으로 사용하는 경우도 있기 때문에 충돌을 방지하기 위해서는 다른 prefix를 쓰는 게 좋겠지요. 안 나올 거라는 확신이 있다면 그냥 쓰셔도 상관은 없습니다 :) (실제로 저는 _<progname>_로 시작하는 prefix를 종종 쓰곤 합니다.)
- 토끼군
C99에 나와있는 좀 더 정확한 규칙은 다음과 같습니다.- 그 외
C99에 나와있는 좀 더 정확한 규칙은 다음과 같습니다.
- 그 외의 미리 정의된 매크로(predefined macro) 이름들은 밑줄문자 다음에 대문자(e.g. _Tag)로 시작하거나 __로 시작하여야 한다. (C99 6.10.8)
- 밑줄문자 다음에 대문자로 시작하거나 __로 시작하는 모든 identifier들은 특정 목적을 위해 미리 예약되어 있다. (C99 7.1.3)
- _로 시작하는 식별자들은 파일 스코프를 갖는 변수 이름, 함수 이름, 숫자상수 이름이나 태그 네임을 위해 미리 예약되어 있다. (C99 7.1.3)
[url=http://www.cinsk.org/cfaqs/html/nod
C FAQ 질문 1.29
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
포트란과 c를 섞어 쓰는경우, 포트란에서 hello()라는 함수를 정의했
포트란과 c를 섞어 쓰는경우, 포트란에서 hello()라는 함수를 정의했다면
이걸 c에서 호출하는 경우 hello_()라고 호출합니다.
이런 경우도 _를 주의해서 써야하죠.
물론 포트란 컴파일러에 따라서 조금씩 다릅니다. "__"가 붙는경우도 있고, 아예 붙지 않는 경우도 있고.
그다지 연관성은 없지만, c이외의 다른 컴파일러에서 컴파일러 내부적으로 "_"를 쓰는 경우도 있다는 것이죠.
흠...예전에 듣고 읽은 기억으로는 기본적으로 예약어들이 _(sing
흠...
예전에 듣고 읽은 기억으로는 기본적으로 예약어들이 _(single)로 되어 있다고 알고 있었는데...
알고 보니... __(double)로 되어 있군요.
앞으로는 좀 더 신경을 써야 할듯 한데...
예약어 중... 로 된게 있나요?
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
프로그래밍 처음 배울때예전에 아주 간단한 덧셈 뺄셈 프로그램을 짠적이
프로그래밍 처음 배울때
예전에 아주 간단한 덧셈 뺄셈 프로그램을 짠적이 있습니다.
5줄짜리 프로그램이었죠..
근데 에러의 원인을 보니 변수명이 겹치더군요
그때 원인을 알수 없어 몇일을 고생했죠. ㅎㅎ
결국 헤더화일 열어보고 알았습니다만 ..
댓글 달기