C99 ...

voider의 이미지

C99 가 먼지 궁금해서 문서를 서치해봤습니다
근데 괜찮은 문서를 발견해서...
해석도 개판이고 존대말 썼다가 반말 썼다... 머 그렇습니다
정정 사항 있으면 누가 문서로 번역해줬으면 좋겠군요...

C99 가 C++98처럼 바뀐점

배열의 최기화에 비상수를 사용할수 있다.
• {
• float x = (float)i; // Valid C90, C99, and C++
• int m[3] = { 1, 2, 3 }; // Valid C90, C99, and C++
• int g[2] = { 0, i }; // Invalid C90
}
c++ 의 // 와 같은 커맨트를 완벽하게 지원한다
흐름제어 블록안에서 로컬변수를 정의할수 있다
• for (int i = 0; i < SIZE; i++)
a[i] = i + 1;
digraphs의 지원( XML때문에 있는듯 합니다)
아래의 토큰은 동일한 의미이다

<: [
:> ]
<% {
%> }
%: #
%:%: ##

함수 내부에서 함수의 선언이 가능합니다
• /* No previous declaration of bar() is in scope */

• void foo(void)
• {
• bar(); /* Implicit declaration: extern int bar() */
}

타입을 자동으로 int로 해석하지 않습니다
• static sizes = 0; /* Implicit int, error */

• struct info
• {
• const char * name;
• const sz; /* Implicit int, error */
• };

• static foo(register i) /* Implicit ints, error */
• {
• auto j = 3; /* Implicit int, error */

• return (i + j);
}

선언을 statement 중간에 사용할수 있습니다
• void prefind(void)
• {
• int i;

• for (i = 0; i < SZ; i++)
• if (find(arr[i]))
• break;

• const char * s; /* Invalid C90, valid C99 and C++ */

• s = arr[i];
• prepend(s);
}

C99 vs C++98

C++ 프리 프로세서는 이러한 키워드를 인식합니다


and &&
and_eq &=
bitand &
bitor |
compl ~
not !
not_eq !=
or ||
or_eq |=
xor ^
xor_eq ^=

배열 파라미터에 한정자가 추가 되었습니다(재미난 내용입니다)
• extern void foo(int str[const]);
extern void foo(int *const str);
위에 것은 같은 표현입니다
• void baz(char s[static 10])
• {
• // s[0] thru s[9] exist and are contiguous
• ...
}
배열 s는 0-9까지의 인덱스를 갇습니다.
이것이 10바이트 단위로 통째로 복사되는것일수도 있습니다.
Sizeof()와 같은 연산이 가능할수도 있습니다. 정확한 내용이 궁금하네요

불린 타입이 추가
_Bool, (_Bool)0, (_Bool)1 <stdbool.h>
bool, false, true 와 같은 것으로 정해지지 않는 이유는 기존 코드와 호환성 때문인 것 같네요

‘a’(C99) != ‘a’(C++98)
c에선 ‘a’ 는 int 푠현 식입니다
memset(&src, ‘a’, sizeof(‘a’)) 는 예상치 못한 결과를 가질수 있다

• clog identifier (이해할수 없는 부분)
C99 declares clog() in <math.h> as the complex natural logarithm function.
C++ declares std::clog in <iostream> as the name of the standard error logging output stream (analogous to the stderr stream). This name is placed into the global namespace if the <math.h> header is included, and refers to the logarithm function. If <math.h> defines clog as a preprocessor macro name, it can cause problems with other C++ code.
// C++ code

#include <iostream>
using std::clog;

#include <math.h> // Possible conflict

void foo(void)
{
clog << clog(2.718281828) << endl;
// Possible conflict
}
Including both the <iostream> and the <cmath> headers in C++ code places both clog names into the std:: namespace, one being a variable and the other being a function, which should not cause any conflicts.
// C++ code

#include <iostream>
#include <cmath>

void foo(void)
{
std::clog << std::clog(2.718281828) << endl;
// No conflict; different types
}

void bar(void)
{
complex double (* fp)(complex double);

fp = &std::clog; // Unambiguous
}
It would appear that the safest approach to this potential conflict would be to avoid using both forms of clog within the same source file.
C99 는 내장 complex imaginary floating 타입을 갇는다

임시적인 정의타입 인스턴스를 만들수 있숩니다( 어째 내가 써놓고도 이해 안가는군요 아래 예제를 확인하세요)

• struct info
• {
• char name[8+1];
• int type;
• };

• extern void add(struct info s);
• extern void move(float coord[2]);

• void predef(void)
• {
• add((struct info){ "e", 0 }); // A struct literal
• move((float[2]){ +0.5, -2.7 }); // An array literal
}

C++의
• void predef2()
• {
• add(info("e", 0)); // Call constructor info::info()
}
이런 표현의 대용품이죠. 그래도 훌륭하네요. 100점

const linkage
• const int i = 1; // External linkage

• extern const int j = 2; // 'extern' optional
static const int k = 3; // 'static' required

c++에선 const가 있으면 파일내부 이름영역을 갇는다고 합니다

동적 sizeof 연산
쿠하~~~
• size_t dsize(int sz)
• {
• float arr[sz]; // VLA, dynamically allocated

• if (sz <= 0)
• return sizeof(sz); // Evaluated at compile time
• else
• return sizeof(arr); // Evaluated at runtime
}
뷰티풀 이란 말을 안할수 없네요
C++에선 지원하지 않습니다

C99의 프리프로세서는 매크로 인자를 비워둘수 있습니다

• #define ADD3(a,b,c) (+ a + b + c + 0)

• ADD3(1, 2, 3) => (+ 1 + 2 + 3 + 0)
• ADD3(1, 2, ) => (+ 1 + 2 + + 0)
• ADD3(1, , 3) => (+ 1 + + 3 + 0)
• ADD3(1,,) => (+ 1 + + + 0)
ADD3(,,) => (+ + + + 0)

C99 에선 enum 의 끝에 콤마를 붙일수 있다
enum Color { RED = 0, GREEN, BLUE, };

C99 는 16진수형식의 floating-point 리터럴 을 지원
float pi = 0x3.243F6A88p+03;

C99는 인라인 함수를 지원합니다

C99는 long long 타입을 지원

C99 _Pragma keyword
• #pragma FLT_ROUND_INF // Preprocessor pragma

_Pragma(FLT_ROUND_INF) // Pragma statement

__func__ 키워드 추가
함수 이름의 문자열 리터럴
개인적으로 VC의 __LINE__ 이 int 값인데 대하여 불만입니다 문자열 리터럴로 되어있는건 없는지…

가변인자 매크로 지원
• #define DEBUGF(f,...) \
• (fprintf(dbgf, "%s(): ", f), fprintf(dbgf, __VA_ARGS__))

• #define DEBUGL(...) \
• fprintf(dbgf, __VA_ARGS__)

• int incr(int *a)
• {
• DEBUGF("incr", "before: a=%d\n", *a);
• (*a)++;
• DEBUGL("after: a=%d\n", *a);
• return (*a);
}
C++은 지원하지 않습니다. 왜 지원안할까요

원문 http://david.tribble.com/text/cdiffs.htm#C90-aggreg-init

Forums: 
dreamstorm의 이미지

c++ 만 쓰다보니...
c99 부터 함수안에 함수정의가 되는건 오늘 처음 알았네요.
gcc 로 돌려보니.. 잘되는군요. scope 문제도 없고..

#include <stdio.h>

int main()
{
    int i = 100;

    int foo()
    {
        printf("main::i is %d \n", i);
        return 0;
    }
    return foo();
}

c++ 에서 이런거 하려면 함수내에 클래스 정의해서 써야 하는데..
빨리 c++ 에도 적용이 되면 개발이 더 즐거울텐데. :P

vacancy의 이미지

function in function은 pascal의 그것과 비슷해졌네요.

더 구조적이 된 것 같아 보기도 좋고
이모저모 편해보입니다.

dreamstorm의 이미지


원글을 살펴보니, c99 와 관련되어 나온 내용은 함수내에 함수의 선언이 가능하다는 것이지, 정의가 가능하다는 내용은 없네요.
일단 gcc 에서 대강 만든 nested function 예제가 컴파일 된것을 보니, C 표준이던가(언제부터인가) gcc 확장인것 같은데....
어떤것인지 아시는분은 답변해주세요..

cdpark의 이미지

voider wrote:
함수 내부에서 함수의 선언이 가능합니다
• /* No previous declaration of bar() is in scope */

• void foo(void)
• {
• bar(); /* Implicit declaration: extern int bar() */
}

이 부분의 해석은 원문과 전혀 다릅니다.

prototype을 따로 적지 않은 함수가 처음 나왔을 때, C 언어에서는 자동으로 int 형을 돌려주는 함수로 취급해서 처리합니다. C99에서는 이것을 에러로 처리하도록 명시한 것이죠. 즉, 모든 함수는 사용하기 전에 반드시 선언해 줘야 합니다.

dreamstorm 님이 언급한 code는 gcc 확장 기능입니다.

pynoos의 이미지

아.. 그렇군요..?

함수안의 함수의.. symbol name mangling은.. 함수내의 static 변수와 같이
local symbol(t type, .<digit>) 로 만들어지는 군요.

#include <stdio.h> 

int main()  
{ 
    static int xxx = 0;
    int i = 100;  

    int foo() 
    { 
        printf("%s is %d \n", __func__, i); 
        return 0; 
    } 
    return foo();  
}

Quote:
$ nm a
08049574 ? _DYNAMIC
08049550 ? _GLOBAL_OFFSET_TABLE_
08048514 R _IO_stdin_used
08049544 ? __CTOR_END__
08049540 ? __CTOR_LIST__
0804954c ? __DTOR_END__
08049548 ? __DTOR_LIST__
0804953c ? __EH_FRAME_BEGIN__
0804953c ? __FRAME_END__
08049614 A __bss_start
w __cxa_finalize@@GLIBC_2.1.3
08049528 D __data_start
w __deregister_frame_info@@GLIBC_2.0
080484b0 t __do_global_ctors_aux
080483b0 t __do_global_dtors_aux
w __gmon_start__
U __libc_start_main@@GLIBC_2.0
w __register_frame_info@@GLIBC_2.0
08049614 A _edata
0804962c A _end
080484f0 ? _fini
08048510 R _fp_hw
080482e4 ? _init
08048360 T _start
08048384 t call_gmon_start
08049534 d completed.1
08049528 W data_start
08048410 t fini_dummy
08048460 t foo.1
08049538 d force_to_data
0804953c d force_to_data
08048420 t frame_dummy
08048384 t gcc2_compiled.
080483b0 t gcc2_compiled.
080484b0 t gcc2_compiled.
080484f0 t gcc2_compiled.
08048450 t init_dummy
080484e0 t init_dummy
08048490 T main
08049614 b object.2
08049530 d p.0
U printf@@GLIBC_2.0
08049538 d xxx.0
sliver의 이미지

pynoos wrote:
아.. 그렇군요..?

함수안의 함수의.. symbol name mangling은.. 함수내의 static 변수와 같이
local symbol(t type, .<digit>) 로 만들어지는 군요.

#include <stdio.h> 

int main()  
{ 
    static int xxx = 0;
    int i = 100;  

    int foo() 
    { 
        printf("%s is %d \n", __func__, i); 
        return 0; 
    } 
    return foo();  
}

Quote:
$ nm a
08049574 ? _DYNAMIC
08049550 ? _GLOBAL_OFFSET_TABLE_
08048514 R _IO_stdin_used
08049544 ? __CTOR_END__
08049540 ? __CTOR_LIST__
0804954c ? __DTOR_END__
08049548 ? __DTOR_LIST__
0804953c ? __EH_FRAME_BEGIN__
0804953c ? __FRAME_END__
08049614 A __bss_start
w __cxa_finalize@@GLIBC_2.1.3
08049528 D __data_start
w __deregister_frame_info@@GLIBC_2.0
080484b0 t __do_global_ctors_aux
080483b0 t __do_global_dtors_aux
w __gmon_start__
U __libc_start_main@@GLIBC_2.0
w __register_frame_info@@GLIBC_2.0
08049614 A _edata
0804962c A _end
080484f0 ? _fini
08048510 R _fp_hw
080482e4 ? _init
08048360 T _start
08048384 t call_gmon_start
08049534 d completed.1
08049528 W data_start
08048410 t fini_dummy
08048460 t foo.1
08049538 d force_to_data
0804953c d force_to_data
08048420 t frame_dummy
08048384 t gcc2_compiled.
080483b0 t gcc2_compiled.
080484b0 t gcc2_compiled.
080484f0 t gcc2_compiled.
08048450 t init_dummy
080484e0 t init_dummy
08048490 T main
08049614 b object.2
08049530 d p.0
U printf@@GLIBC_2.0
08049538 d xxx.0

T,b,d,R 이런것들을 잘 모르겠는데

어떤 문서를 보면 될까요?

아님 직접 가르쳐 주셔도.. :P

pynoos의 이미지

linux 에서 man nm 보다 info nm 해보시면 nm의 출력결과에 대해서는 좀더 자세히 나오지요.. ^^

댓글 달기

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