함수나 변수명에 __를 붙이면 안된는 이유??

aNsITAte의 이미지

예전에 씨 처음 배울때 __, _는 붙일 수는 있지만 붙이지 않는 것이 좋다는 것을 봤느네둉.

그때는 그냥 그런가 보다 했는데... 요즘 좀더 깊게 공부할 기회가 있어서 공부를 하고있는데 이것에 관한 이야기가 좀더 나오더군요.

자세한 내용은 나오지 않지만 컴파일러 내부의 처리과정때문에 나오는 문제인것 같은데..

이유 아시는분 좀 알려주세염~ ㅡ.ㅡ;;

익명 사용자의 이미지

C 표준에서 _, __로 시작하는 이름은 구현체(implementation)에 의해 예약되어 있기 때문입니다. 예를 들어 컴파일러 제작자가 표준 라이브러리에서 _strcpy란 이름의 함수를 내부적으로 사용하고 있다고 칩시다. 그러면 사용자가 _strcpy라는 이름을 사용한다면 문제가 생길 수 있습니다.

aNsITAte의 이미지

실제 제공되는 라이브러리에서는 strcpy로 알고 쓰고 있지만 내부적인 표현과 실제 구현은 _strcpy 이런식으로 사용된다는 말인가요?

어떤 소스를 보면 특별히 이런 함수를 많이 이용하는 소스도 있는 것같던데.. (프로그래머가 만든건지 제공되는 라이브러리인지는 모르겟지만..)
이런식의 구현이 어떤 장점이 있는걸까요?

그립다는 것은 아직도 네가 내 안에 남아 있다는 뜻이다.
그립다는 것은 지금은 너를 볼 수 없다는 뜻이다.
볼 수는 없지만 보이지 않는 내 안 어느 곳에 네가 남아 있다는 뜻이다.
-이정하의 《혼자 사랑한다는 것은》중에서-

익명 사용자의 이미지

> 실제 제공되는 라이브러리에서는 strcpy로 알고 쓰고 있지만 내부적인 표현과 실제 구현은 _strcpy 이런식으로 사용된다는 말인가요?

아닙니다. 확대 해석하지 말고 제대로 읽어 주십시오.

_, __로 시작하는 이름은 컴파일러 제작자가 사용하는 것이 일종의 관례입니다. 프로그래머가 _, __로 시작하는 이름을 사용할 경우 컴파일러 제작자가 내부적으로 사용하는 이름과 충돌할 가능성이 커집니다.

> 이런식의 구현이 어떤 장점이 있는걸까요?

보통 _, __로 시작하는 이름을 사용하는 이유는 충돌 가능성이 적은 이름을 만들기 위해서 입니다. 그렇다면 꼭 _, __로 시작하는 이름이 아니라도 상관이 없습니다. t_ 라던가 120894_ 라던가 아니면 이름 앞이 아니라 뒤에 _, __를 붙이는 방법도 있겠지요.

aNsITAte의 이미지

^^a

그립다는 것은 아직도 네가 내 안에 남아 있다는 뜻이다.
그립다는 것은 지금은 너를 볼 수 없다는 뜻이다.
볼 수는 없지만 보이지 않는 내 안 어느 곳에 네가 남아 있다는 뜻이다.
-이정하의 《혼자 사랑한다는 것은》중에서-

mirr의 이미지

역시 __ 로는 아무리 검색해도 안나오는군요.
제 기억에 관련 쓰레드가 몇개 있었던것 같은데 말이죠....

http://bbs.kldp.org/viewtopic.php?t=58147

여기 보시면 그 부분에 대해서 나오는듯 합니다.

nohmad님 링크 읽어보시면 설명되있습니다만...영업니다 :wink:

내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.

lifthrasiir의 이미지

Anonymous wrote:
t_ 라던가 120894_ 라던가...

딴지는 아니지만 120894_면 identifier가 안 되겠군요... :)

strcpy를 _strcpy로 쓰건 말건 그건 컴파일러에 따라 다 다를 수 있습니다. 하지만 일반적으로 컴파일러에서 _나 __로 시작하는 identifier들을 내부적인 목적으로 많이 사용하고 심지어 extension으로 사용하는 경우도 있기 때문에 충돌을 방지하기 위해서는 다른 prefix를 쓰는 게 좋겠지요. 안 나올 거라는 확신이 있다면 그냥 쓰셔도 상관은 없습니다 :) (실제로 저는 _<progname>_로 시작하는 prefix를 종종 쓰곤 합니다.)

- 토끼군

익명 사용자의 이미지

C99에 나와있는 좀 더 정확한 규칙은 다음과 같습니다.

- 그 외의 미리 정의된 매크로(predefined macro) 이름들은 밑줄문자 다음에 대문자(e.g. _Tag)로 시작하거나 __로 시작하여야 한다. (C99 6.10.8)
- 밑줄문자 다음에 대문자로 시작하거나 __로 시작하는 모든 identifier들은 특정 목적을 위해 미리 예약되어 있다. (C99 7.1.3)
- _로 시작하는 식별자들은 파일 스코프를 갖는 변수 이름, 함수 이름, 숫자상수 이름이나 태그 네임을 위해 미리 예약되어 있다. (C99 7.1.3)

익명 사용자의 이미지

포트란과 c를 섞어 쓰는경우, 포트란에서 hello()라는 함수를 정의했다면
이걸 c에서 호출하는 경우 hello_()라고 호출합니다.

이런 경우도 _를 주의해서 써야하죠.
물론 포트란 컴파일러에 따라서 조금씩 다릅니다. "__"가 붙는경우도 있고, 아예 붙지 않는 경우도 있고.

그다지 연관성은 없지만, c이외의 다른 컴파일러에서 컴파일러 내부적으로 "_"를 쓰는 경우도 있다는 것이죠.

서지훈의 이미지

흠...
예전에 듣고 읽은 기억으로는 기본적으로 예약어들이 _(single)로 되어 있다고 알고 있었는데...
알고 보니... __(double)로 되어 있군요.

앞으로는 좀 더 신경을 써야 할듯 한데...
예약어 중... 로 된게 있나요?

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

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

양문철의 이미지

프로그래밍 처음 배울때
예전에 아주 간단한 덧셈 뺄셈 프로그램을 짠적이 있습니다.

5줄짜리 프로그램이었죠..

근데 에러의 원인을 보니 변수명이 겹치더군요

그때 원인을 알수 없어 몇일을 고생했죠. ㅎㅎ

결국 헤더화일 열어보고 알았습니다만 ..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.