C언어에서 변수명의 최대 길이는 어떻게 되나요?

ktd2004의 이미지

C언어에서 정의하는 변수명의 최대 길이는 어떻게 되나요?

이 문제를 한번도 고민해 본적도, 문제가 되었던 적도 없습니다.
그런데 누가 물어보더군요.

그래서 인터넷을 뒤졌는데,
32라고 나온곳, 제한이 없다라는 곳.. 여러 답이 있더군요.

정확하게 C언어에서 가능한 변수명의 최대길이는 어떻게 되나요?

lifthrasiir의 이미지

KTD wrote:
C언어에서 정의하는 변수명의 최대 길이는 어떻게 되나요?

이 문제를 한번도 고민해 본적도, 문제가 되었던 적도 없습니다.
그런데 누가 물어보더군요.

그래서 인터넷을 뒤졌는데,
32라고 나온곳, 제한이 없다라는 곳.. 여러 답이 있더군요.

정확하게 C언어에서 가능한 변수명의 최대길이는 어떻게 되나요?

이럴 때 필요한 것이 표준이죠. -_-; ISO 9899(C99 표준)와 ISO 14882(C++98 표준)을 참고하시는 게 좋을 것입니다.

일단 기본적으로 C와 C++에서 변수명(정확하게는 identifier)의 길이에 제한이 없는 건 맞습니다:

Quote:
ISO 9899 sect 6.4.2.1 (2):
... There is no specific limit on the maximum length of an identifier.
ISO 14882 sect 2.10 (1):
An identifier is an arbitrarily long sequence of letters and digits. ...

하지만 실제로 무한한 길이의 identifier라는 건 불가능하기 때문에, 어느 길이 이상만 지원하면 된다는 식의 가이드라인이 있습니다. C와 C++의 차이는 여기에서 나타납니다:
Quote:
ISO 9899 sect 4 (1):
In this International Standard, "shall" is to be interpreted as a requirement on an implementation or on a program; conversely, "shall not" is to be interpreted as a prohibition.

ISO 9899 sect 5.2.4:
... The following summarizes the language-related environmental limits on a conforming implementation; ...

ISO 9899 sect 5.2.4.1 (1):
The implementation shall be able to translate and execute at least one program that contains at least one instance of every one of the following limits:
...
-- 63 significant initial characters in an internal identifier or a macro name
-- 31 significant initial characters in an external identifier
...


즉 C는 적어도 63자 이하의 내부 이름(외부 이름은 31자)을 제대로 처리할 것을 강제합니다. (앞에서 shall의 의미를 설명한 것을 확인해 보세요) 반면에...
Quote:
ISO 14882 Annex B (2):
The limits may constrain quantities that include those described below or others. The bracketed number following each quantity is recommended as the minimum for that quantity. However, these quantities are only guidelines and do not determine compliance.
...
-- Number of initial characters in an internal identifier or macro name [1024].
-- Number of initial characters in an external identifier [1024].
...

C++는 1024자 이하의 내부/외부 이름을 제대로 처리할 것을 권장합니다. 여기서 권장이라는 것은 이 가이드라인을 안 지킨다고 표준에 어긋나는 구현이 되는 건 아니라는 뜻입니다. C와는 다르죠.

정리하면, "표준에서 길이에 제한을 두는 건 아니지만 31자 이상의 이름은 쓰는 걸 자제하는 게 좋다" 정도 될까요. :)

- 토끼군

덤: 당연한 소리지만, 제가 밑줄 친 부분은 표준에 강조된 부분이 아니라 제가 설명을 위해서 강조한 것일 뿐입니다.

ktd2004의 이미지

정말로 상세한 설명 감사드립니다.
복받으실꺼예요... ^^;

pynoos의 이미지

c++의 경우 내부에서 1024정도를 처리하지 못하면, template을 처리하지 못하는 난감함이.. 있지요.

어떤 컴파일러는 경고를 내고, 프로그래머는 경고를 없애기 위해 pragma를 쓰지요

lifthrasiir의 이미지

pynoos wrote:
c++의 경우 내부에서 1024정도를 처리하지 못하면, template을 처리하지 못하는 난감함이.. 있지요.

어떤 컴파일러는 경고를 내고, 프로그래머는 경고를 없애기 위해 pragma를 쓰지요

대표적으로 VC++ 6의 255자 제한... -_-

- 토끼군

댓글 달기

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