[질문]__FILE__,__LINE__ 전처리매크로의 원형을 볼수 있는 곳이 어디인지요?

fefe7270의 이미지


__FILE__,__LINE__ 전처리 매크로 함수의 원형을 보고 싶은데요..

어케 돌아가는지 해서요.

아시는 분 꼭좀 알려주세요...

부탁드립니다.

jick의 이미지

컴파일러에서 지원하는 특수 매크로입니다. (매크로라고 해도 되나? -_-)

winner의 이미지

Predefined constant 라고 나와 있을 것 같은데...
C 표준 좀 읽어봐야겠네요.

cppig1995의 이미지

define은 지정보단 정의 정도로(cf. declaration 선언) 옮기는 경향이 있어서,
기정의 상수 정도면 괜찮은 것 같습니다.



"그거 이름은 하늘이라고 합니다. 무사장님." - 제국군 가시나무 군단 312소대장 틸러 달비 부위
http://cppig1995.n-pure.net/mh || 몽화 대사전

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

fefe7270의 이미지

compiler마다 사용하는 명령어가 다르니 원형이 없을 수도 있겠습니다만.
ansi c 에서 정의되어진 순서도나 뭐 그런거는 없을까요?
그런게 있어야 compiler업체들도 그걸 보고 구현을 했을것 같은데요.

chadr의 이미지

표준은 아닌걸로 압니다. 그렇기 때문에 컴파일러마다 다릅니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

cppig1995의 이미지

__FILE__과 __LINE__은 ANSI/ISO C(C89/C90)와 AMD1(C95)를 거쳐 C99까지도 잘 표준입니다.
gcc 표준 기능(맞나?)이었던 __func__도 C99에서 표준이 되었습니다.

그러나 순서도 같은 건 없습니다.(함수가 아니니까요) 그냥 __FILE__은 파일이름 __LINE__은 줄번호고
#line으로 지정할 수 있다(이건 표준인지 헷갈립니다) 정도만 적혀 있습니다.



"그거 이름은 하늘이라고 합니다. 무사장님." - 제국군 가시나무 군단 312소대장 틸러 달비 부위
http://cppig1995.n-pure.net/mh || 몽화 대사전

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

winner의 이미지

__FILE__, __LINE__ 은 C 표준에 정의되어 있지만 함수가 아닙니다.
#define 에 의해 기술되면 다 macro 함수라고 생각하시는 것 같은데
상수가 정의되면 macro 상수라고 하죠.

이경우는 #define 에 의해 기술되지 않으므로 predefined constant 정도라고 하지 않을까 싶네요.

cppig1995의 이미지

__FILE__과 __LINE__, 그리고 __func__(C99)는 기정의 상수(predefined constants)입니다.
__FILE__과 __LINE__을 지정하는 데는 #define이 아닌 #line(표준인진 잘 모르겠습니다)을 사용하며,
__func__를 지정하는 데는 굳이 따지자면 함수를 여는 중괄호가 사용되므로(억지스럽지만) 매크로 상수로 볼 수는 없으며,
매크로 함수는 아닙니다.

#define에 의해 지정되는 것은 매크로 함수(macro functions)와 상수(macro constants)가 있으며,
(매크로 함수의 원형(prototype)이라는 것이 말이 될는진 잘 모르겠지만)
어쨌든 매크로 상수에는 확실히 원형이 없고, 말씀하신 두 상수들은
__FILE__()이나 __LINE__()처럼 사용하지 않는 이상, 확실히 함수는 아닙니다. 따라서 원형은 없습니다.



"그거 이름은 하늘이라고 합니다. 무사장님." - 제국군 가시나무 군단 312소대장 틸러 달비 부위
http://cppig1995.n-pure.net/mh || 몽화 대사전

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

fefe7270의 이미지

제가 이 매크로들의 원형이 있는지 물어본것은
이것들과 똑같은 기능을 하는 함수들을 만들기 위해서 입니다.
혹시 이 같은 기능의 함수를 만들 수 있다면 어떻게 해야 하는지 아시는분
알려주시면 감사하겠습니다.

cppig1995의 이미지

"불-가-능-합-니-다-!"

그런 함수가 있어도 전혀 쓸모가 없습니다. 왜냐 하면:

001 int getLineNumber()
002 {
003         return /*어떤 방법으로 줄 번호를 얻는다.*/;
004 }

한 다음 getLineNumber()를 호출하면 언제든 3만 반환될 것이기 때문입니다.



"그거 이름은 하늘이라고 합니다. 무사장님." - 제국군 가시나무 군단 312소대장 틸러 달비 부위
http://cppig1995.n-pure.net/mh || 몽화 대사전

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

blkstorm의 이미지

저도 몇년전에 회사 다닐때 선배사원한테 들은건데...

컴파일러에서 바이너리를 생성할 때 (아니면 preprocessing을 할때), 소스코드상에 __FILE__,__LINE__,(gcc에서는 __FUNCTION__도 가능)

이 검색되면 그에 해당하는 값의 상수로 대치하는 것으로 알고 있습니다.

예를 들어서, c파일의 100번째 줄에,

100: printf("%d",__LINE__);

이 있다면 소스코드 상에서는 저렇게 넣었지만

전처리과정에서

100: printf("%d",100);

으로 바뀐 다음에 컴파일을 한다는 뜻이죠.

정확하다고 말씀드릴순 없지만, 기본적인 동작은 이런 것으로 기억하고 있습니다.

그러므로, '원형'이라는게 존재하지 않죠.

댓글 달기

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