[완료]함수 선언이... 이해가 안되게 되어있습니다... 다음과같은 함수는 어떤 의미를 가지나요..?

hoyeon222의 이미지

에뮬레이터인 TEMU 소스입니다.
어떻게 돌아가는지 보고 있는데... 다음과 같은 형태로 함수가 선언되어 있습니다,
매번 int sum(int a, int b)이런거나 봐왔지, 저렇게 복잡하게 선언되어있는건, 처음봐서, 도저히 이해가 안되서 질문을 드립니다
(())는 무엇을 의미하며 어떤게 매개변수인지,,, 아, 머리가 너무 복잡하네요,,,
여러개의 예제 함수 및 변수 선언들을 올려봅니다..
고수님들 조언 부타드려요..

struct __attribute__ ((__packed__)) vmcb_control_area {
uint16_t intercept_cr_read;
uint16_t intercept_cr_write;
uint16_t intercept_dr_read;
uint16_t intercept_dr_write;
uint32_t intercept_exceptions;
uint64_t intercept;
uint8_t reserved_1[44];
uint64_t iopm_base_pa;
uint64_t msrpm_base_pa;
uint64_t tsc_offset;
uint32_t asid;
uint8_t tlb_ctl;
uint8_t reserved_2[3];
uint32_t int_ctl;
uint32_t int_vector;
uint32_t int_state;
uint8_t reserved_3[4];
uint32_t exit_code;
uint32_t exit_code_hi;
uint64_t exit_info_1;
uint64_t exit_info_2;
uint32_t exit_int_info;
uint32_t exit_int_info_err;
uint64_t nested_ctl;
uint8_t reserved_4[16];
uint32_t event_inj;
uint32_t event_inj_err;
uint64_t nested_cr3;
uint64_t lbr_ctl;
uint8_t reserved_5[832];
};

static void __attribute__((noreturn)) error(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
fprintf(stderr, "qemu-img: ");
vfprintf(stderr, fmt, ap);
fprintf(stderr, "\n");
exit(1);
va_end(ap);
}

void __attribute__((fastcall)) taintcheck_reg2mem(int regidx, int size, void *ptr)

----------------------------------------------------------------------------------

아 또 이해가 안되는 선언이 있어서요,,, 아래의 ##은 대체 무엇인지요;;

#define xglue(x, y) x ## y
#define glue(x, y) xglue(x, y)

----------------------------------------------------------------------------------

아... 미치겠습니다, 책을 찾아봐도 없고, 구글링해도 저런건 안나오고...

세이군의 이미지

1. (( blahblah )) : 컴파일러와 링커에게 전달하는 키워드 입니다. 특정 방식으로 해석하라는 의미입니다.
2. #define xglue(x, y) x ## y : x ## y의 의미는 단순히 문자열 합치기 입니다. A ## B라고 적혀 있다면 이는 AB로 해석됩니다. 함수처럼 보이지만 함수가 아니라 단순히 문자열 바꾸기와 동일한 역할을 합니다.

참고
코드상에 glue(A, B)라고 적혀 있는 경우
1단계 해석 : xglue(A, B) // 두번째 #define에 의한 결과입니다.
2단계 해석 : A ## B // 첫번째 #define에 의한 결과입니다.
3단계 마무리 : AB // ##의 역할에 의한 결과입니다.

세이군의 이미지

본문 내용에 3가지를 올려주셨는데요.
1. struct __attribute__ ((__packed__)) vmcb_control_area {내부 구조는 생략함}
-> 시스템의 비트수에 따라 구조체를 정렬하라는 의미입니다.
32비트 시스템의 경우 4바이트 형태로 정렬을 하면서 바이트 단위에 맞지 않는 경우 패딩비트가 들어가는데
(int, char 하나씩 들어가 있는 구조체를 설정할 경우 시스템내부적으로 char 1바이트의 패딩이 추가됨 그래서 4바이트로 맞춤)
((__packed__))가 추가되는 경우 이 패딩비트(또는 패딩바이트)를 무시합니다.

2. static void __attribute__((noreturn)) error(const char *fmt, ...) {내부 명령들 생략}
-> 함수에서 리턴하는 값이 없습니다. 이미 앞부분에서 void로 설정했기 때문에 리턴값이 없는 것은 지정되어있지만 컴파일러에게 추가로 전달하는 키워드입니다.
이 함수를 사용하는 방법은 printf()문과 동일합니다.

3. void __attribute__((fastcall)) taintcheck_reg2mem(int regidx, int size, void *ptr)
-> 컴파일러는 함수를 컴파일하면서 내부적으로 함수의 이름을 일정 규칙에 의해 치환을 합니다.
이때 사용하는 규칙 중 하나가 fastcall이고 기본 원칙에 의해 치환하지 말고 fastcall에서 요구하는 방식으로 치환하라는 의미입니다.

oppor의 이미지

이런건 도대체 어디서 배워야 하나요?

듣도 보도 못한 c 문법이네요.

pastime의 이미지

__attribute__ ((...)) 는 gcc의 확장 기능입니다.
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

전처리기의 ## 연산자는 C 표준에 정의된 것입니다.
C 언어를 (제대로) 다루는 책이라면 당연히 설명되어 있을텐데요..?

hoyeon222의 이미지

답변 감사합니다...! 정말 이해 안되는 문법이었는데, 많은 도움이 되었습니다..!

댓글 달기

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