parser error 가 자꾸 나는데요 이유 좀 알려주세요....

miso의 이미지

헤더 파일 제일 처음에 다음과 같이 선언 되어 있습니다.

============
#define printf if (1) {} else printf
#define malloc(size) if (size = ((1 + size % 512) * 512)) malloc (size)

#include <stdio.h>
#include <stdlib.h>
==========

컴파일은 하면
#include <stdio.h>를 가르키고
에러 메세지는 parse error before `if'라고 나오면서 컴파일이 되질 않습니다....

무엇이 문제인지 고수님들 알려주세요.... ㅜ.ㅜ;;;

고물의 이미지

#include <stdio.h>
#include <stdlib.h>
#define printf if (1) {} else printf 
#define malloc(size) if (size = ((1 + size % 512) * 512)) malloc (size) 

위와 같이 include는 제일 처음에 써주셔야 합니다.

체스맨의 이미지

stdio.h 및 stdlib.h 인클루드 전에 printf 와 malloc 이 #define 됐으므로,
전처리기는 stdio.h 및 stdlib.h (또는 그 안에 인클루드된 헤더)
의 printf 와 malloc을 #define 한 것으로 대체합니다.

결국 저 구문이 헤더 안 에 들어앉게 되어 에러죠.

앗 늦었군요. -_-

Orion Project : http://orionids.org

miso의 이미지

그런데 이소스는 제가 코딩한 소스가 아니라......
이미 만들어진 소스를 제가 다시 한번 컴파일 해 보는 건데요....
제가 아는 사람이 만든 소스가 아니라 저희 회사 사람이 소스를 분석하라고 해서 분석하는 도중에 한번 컴파일을 해보려고 하는데...
main 함수가 있는 곳 즉 처음부터 막히네요.....

제가 알기로는 헤더 파일에 정의 되어 있는 값을 변경하려면.....
헤더 파일을 include하기 전에 변경하려는 값을 define 해주면 된다고 알고 있는데 아닌가요?

이사람도 stdio에 정의 되어 있는 함수를 변경하려고
#define printf if (1) {} else printf
#define malloc(size) if (size = ((1 + size % 512) * 512)) malloc (size)
이것을 헤더 파일 전에 define 하지 않았을까 생각이 드는데....

*^^*

고물의 이미지

/usr/include/stdio.h의 278번째줄
extern int printf (__const char *__restrict __format, ...) __THROW;

위에 macro를 적용하면

extern int if(1) {} else printf (__const char *__restrict __format, ...) __THROW;

위와 같이 됩니다.. 그래서 에러가 나는거죠..

miso의 이미지

고물님의 말씀이 이해가 잘 안돼는데... 쉽게 설명해주시면 안될까요?
제가 C를 시작한지 얼마 안돼고 또 linux C를 시작한지는 한 6달 정도 밖에는 안되거든요.... ^^;;;

*^^*

고물의 이미지

#define printf if (1) {} else printf 
#define malloc(size) if (size = ((1 + size % 512) * 512)) malloc (size) 
#include <stdio.h> 
#include <stdlib.h> 

위의 코드라고 했을 경우 stdio.h를 포함하게 됩니다.
stdio.h는 아래와 같이 함수부분이 선언되어 있습니다.
이때 먼저 define으로 printf를 선언해버렸기 때문에
나중에 include한 stdio.h의 내용들도 define 선언에 의해서 치환이 되게 됩니다.

/usr/include/stdio.h의 278번째줄
extern int printf (__const char *__restrict __format, ...) __THROW;
위의 코드에서 printf를 define으로 선언한 printf if (1) {} else printf 를 적용시키면 아래와 같이 됩니다.
extern int if(1) {} else printf (__const char *__restrict __format, ...) __THROW;
위에서 보면 함수 형을 선언한 것인데 define으로 바뀌어 버려서 문법적으로 맞지 않게 됩니다. 그렇기 때문에 에러가 나는 것입니다.

miso의 이미지

지금 제가 분석하는 소스가 지금 서비스 되고 있는 서버 소스인데요....
이것이 문제가 된다면.... 지금 돌아가고 있는 서비스는 어떻게 된건지...ㅡㅡ????
혹시 소스 작성된 날짜를 보니깐 2000년도에 만들어 졌는데.... 2000년도 stdio.h와 지금 2002년도 stdio.h 파일이 달라서.....
아님 그때 커널 소스와 지금의 커널 소스가 달라서 그렇수도 있나요?.....
아님 말도 안돼는 소린가?
어찌된 영문인지.....
만약에 이소스를 제 PC에서 컴파일 하려면...
코드:
#define printf if (1) {} else printf
#define malloc(size) if (size = ((1 + size % 512) * 512)) malloc (size)

을 주석을 달면 되나요?.....

저는 이소스를 전혀 수정하지 않고 그대로 컴파일 해보고 싶은데.... ㅡㅡ;;;

방법이 없을까요?

*^^*

고물의 이미지

네.. 주석처리 하세요.

아니면 현재 서비스 되고 있는 서버에서 컴파일 해보시던지요.

댓글 달기

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