C 매크로에서 컴파일 에러 난 경우

spacelee의 이미지

보통 매크로를 쓴 라인 넘버가 출력되는데,

그 라인 넘버와 함께 매크로 정의한 부분의
몇번째 라인에서 에러가 났는지
(여러 라인으로 매크로가 정의 된 경우)
함께 출력하도록 해주는 방법은 없을까여?

cinsk의 이미지

컴파일러가 특별히 알아서 처리하지 않는한, 정상적인 방법으론 힘듭니다.

spacelee의 이미지

정작 없는 거였군여. ㅜㅜ
컴파일러에서 그거 처리좀 해주면 좋겠구만.
CINSK님 그거 처리하는 컴파일러 좀 만들어주세용~~^^;;

권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -

익명 사용자의 이미지

매크로 함수 만들때 '잘' 만들면 됩니다. 에러메시지를 확인해야 할 정도의 긴 함수를 매크로 함수로 만든다는게 이해가 안되는군요. inline 키워드도 있는데...

elanoia의 이미지

저 같은 경우는 preprocessor를 이용해서 다시 컴파일을 해 봅니다.

cpp a.c > a.cpp.c
gcc -c a.cpp.c

이러면 대충 어디가 에러인지 확인해 볼수 있습니다.

음... 이제 부터 생각해 봐야겠다.

spacelee의 이미지

아 좋은 방법 알려주셔서 감솨~

inline은 저도 많이 쓰기는 합니다.
그런데 굉장히 cpu-intensive 한 부분에서는
매크로랑 inline도 차이가 나는 것 같던데요.

그리고 inline은 gcc매뉴얼인가를 보면
어셈블러로 몇 라인 이상인거는 inline으로 컴파일 하지 않는다고
본 것 같기도 하구요.

혹시 이 부분에 대해 자세히 아시면 좀 알려주세요.

권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -

freezm7의 이미지

spacelee wrote:
아 좋은 방법 알려주셔서 감솨~

inline은 저도 많이 쓰기는 합니다.
그런데 굉장히 cpu-intensive 한 부분에서는
매크로랑 inline도 차이가 나는 것 같던데요.

그리고 inline은 gcc매뉴얼인가를 보면
어셈블러로 몇 라인 이상인거는 inline으로 컴파일 하지 않는다고
본 것 같기도 하구요.

혹시 이 부분에 대해 자세히 아시면 좀 알려주세요.

EC++ Item 33 을 보시면

Quote:
'inline 디렉티브는 register 처럼 컴파일러에게 내리는 명령이 아니라 힌트일 뿐이다(컴파일러가 원하거나 인라인 처리하기 어려울 경우 이를 무시해도)'

라고 적혀 있습니다.

저는 inline 을 굳이 넣어서 코딩하진 않습니다. optimization 옵션을 주면 inline 키워드를 넣지 않은 코드라도 inline 했을 때 더 유리하다면 컴파일러가 inline 처리를 합니다.

성능에 관련된 문제들은 대체로 컴파일러에게 맡겨버리는게 속 편합니다.

그리고 대부분의 컴파일러들이 preprocessing 과정만을 거친 코드를 얻을 수 있는 방법을 제공합니다.
gcc 의 경우에는 cpp 라는 분리된 전처리기를 가지고 있지만, 제가 겪어본 다른 컴파일러들도 다들 옵션을 가지고 있더군요. 잘 찾아보세요 ^^;

즐겁게 살아 볼까나~*

cinsk의 이미지

참고로 Emacs를 쓰시면, 영역(블럭)을 지정해서, 그 부분만 preprocessor를 돌려볼 수 있습니다. 예를 들어. 다음과 같은 코드 블럭이 있다 치고,

#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>


#define MIN(a, b)	(((a) > (b)) ? (b) : (a))


void foo(int a)
{
  int a, b;
  int c;
  int fd;

  c = MIN(a, b);
  fd = open("/tmp/tmp.tmp", O_RDONLY | O_EXCL);
}

여기에서 맨 마지막에서 두 줄 (c = ... 와 fd = ...)을 영역 지정하고 C-c C-e를 누르면, 영역을 C preprocessor 처리 후, 다음과 같이 보여줍니다:

  c = (((a) > (b)) ? (b) : (a));
  fd = open("/tmp/tmp.tmp", 00 | 0200);

C-c C-e는 M-x c-macro-expand와 같은 기능입니다.

참고하세요.

spacelee의 이미지

여러가지 좋은 정보 감사드립니다.^^

그런데, 여기 컴파일러 직접 만드시는 분들도 많이 계신 것 같아서
호기심에서 여쭤보는 건데요.
컴파일러에서 그런 문제를 처리해주는 것이 어려운가여?

사용자 편의성을 고려해서 컴파일러 좀 만드면
어디가 덧나나 싶어서..^^;;

전처리기랑 컴파일러랑 분리되어 있는 구조라서
좀 어려울 것 같다는 생각이 불쑥 들기도 하는군요...
모듈화와 그 trade-off 관점에서 생각해야 되는 문제인지..

권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -

익명 사용자의 이미지

spacelee wrote:
여러가지 좋은 정보 감사드립니다.^^

그런데, 여기 컴파일러 직접 만드시는 분들도 많이 계신 것 같아서
호기심에서 여쭤보는 건데요.
컴파일러에서 그런 문제를 처리해주는 것이 어려운가여?

사용자 편의성을 고려해서 컴파일러 좀 만드면
어디가 덧나나 싶어서..^^;;

전처리기랑 컴파일러랑 분리되어 있는 구조라서
좀 어려울 것 같다는 생각이 불쑥 들기도 하는군요...
모듈화와 그 trade-off 관점에서 생각해야 되는 문제인지..


원래 유닉스의 철학이 최대한 모듈화시키는겁니다. 그래서 컴파일 같은것도 전처리하고 어셈블리로 만들고 실제 링크하고 이 작업들이 분리시킨겁니다.
이런 방식의 장점은 이식이 쉽고 에러날 확률이 적어진다는겁니다.
실제로 gcc이식시에는 전처리기는 신경쓸 필요가 없습니다.
어셉블리로 만들어주는 부분만 신경쓰면 됩니다.
그리고 사용자는 이런 내부적인거 신경쓸 필요없이 그냥 gcc만 치면 끝입니다.

댓글 달기

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