C Programming, A Modern Approach - K.N.KINGμΌλ‘ CμΈμ΄λ₯Ό 곡λΆνλ©΄μ μ 리ν λ΄μ©μ
λλ€.
λ²μλ³Έ https://wikidocs.net/book/2494 μ μ°Έκ³ νμμ΅λλ€.
μ μ²λ¦¬κΈ°λ μ»΄νμΌ μ΄μ μ C νλ‘κ·Έλ¨μ μμ ν΄μ£Όλ μννΈμ¨μ΄μ΄λ€.
μ μ²λ¦¬κΈ°μ νλμ μ μ²λ¦¬ μ§μμ(preprocessing directives)μ μν΄ μ μ΄λλ€.
(μ μ²λ¦¬ μ§μμ : # λ¬Έμλ‘ μμλλ λͺ
λ Ήμ΄
ex. #define, #include)
#define μ§μμλ 맀ν¬λ‘(macro)λ₯Ό μ μνλ€.
(맀ν¬λ‘ : μμ, μμ£Ό μ¬μ©νλ ννμ λ±μ μλ―Ένλ μ΄λ¦)
#include : νΉμ νμΌμ μ΄κ³ , κ·Έ λ΄μ©λ¬Όμ μ»΄νμΌν νμΌμ μΆκ°νλ€.
μλ κ·Έλ¦Όμ μ»΄νμΌ κ³Όμ μμ μ μ²λ¦¬κΈ°μ μν μ 보μ¬μ€λ€.
μ μ²λ¦¬κΈ°λ μ£Όμμ λμ΄μ°κΈ° λ¬Έμ νλλ‘ λ체νλ€.
λλΆλΆμ C μ»΄νμΌλ¬λ μ μ²λ¦¬κΈ°μ μΆλ ₯λ¬Όμ λ³Ό μ μκΈ° λλ¬Έμ μ€λ₯λ₯Ό μ°Ύμ λ μ μ©νλ€.
π μ μ²λ¦¬ μ§μμλ€
1) 맀ν¬λ‘ μ μ(macro definition) : ex. #defineμΌλ‘ 맀ν¬λ‘ μ μ
2) νμΌ μΆκ°(file inclusion) : ex. #includeλ‘ νμΌ μΆκ°
3) 쑰건μ μ»΄νμΌ(conditional compilation) : ex. #if, #ifdef, ifndef, #elif, #else, #endifλ‘ μ½λμ νΉμ λΆλΆμ μΆκ°νκ±°λ μ μΈ
π μ§μμλ€μ κ·μΉ
1) #μΌλ‘ μμνλ€.
2) μ§μμμ ν ν° μ¬μ΄μλ λμ΄μ°κΈ°κ° μμμ κ°μλ§νΌ λ€μ΄κ° μ μλ€.
# define N (100) (o)
3) νλμ μ§μμμμ λ€μμ€λ‘ λκΈ°λ €λ©΄ \λ‘ λλμΌ νλ€.
#define DISK_CAPACITY (SIDES * \
TRACKS_PER_SIDE)
4) νλ‘κ·Έλ¨ μ΄λμλ λ±μ₯ν μ μλ€
맀ν¬λ‘μλ λ¨μ(simple)맀ν¬λ‘ λΏ μλλΌ λ§€κ°λ³μ(parameterized)맀ν¬λ‘λ μ‘΄μ¬νλ€.
π simple macro (λλ object-like macro)
#define identifier replacement-list
μ μ²λ¦¬κΈ°λ μλ³μκ° λ체λͺ©λ‘μ μλ―Ένκ² λ¨μ νμ, νμΌμ μλ³μκ° λ±μ₯νλ©΄ μ μ²λ¦¬κΈ°λ λ체λͺ©λ‘μΌλ‘ λ체νλ€.
λ¨μ 맀ν¬λ‘λ κ³ μ μμλ₯Ό μ μνκΈ° μν΄ μ£Όλ‘ μ¬μ©λλ€.
#define TRUE (1)
#define FALSE (0)
#define PI (3.14159)
#define MEM_ERR ("Error: not enough memory")
π #defineμ μ₯μ
1) νλ‘κ·Έλ¨μ κ°λ
μ±, μμ μ±μ λμ¬μ€λ€.
2) μΌκ΄μ± μλ μ½λλ μ€νλ₯Ό λ°©μ§ν μ μλ€.
#define DEBUG
Cμμ 맀ν¬λ‘λ₯Ό μμμ²λΌ μ¬μ©ν λ μ΄λ¦μ μ λΆ λλ¬Έμλ‘ μμ±νλ κ²μ΄ κ΄μ΅μ΄λ€.
π parameterized macro (λλ function-like macro)
#define identifier( X1, X2, ..., Xn ) replacement-list
π 맀κ°λ³μ 맀ν¬λ‘(parameterized macro)μ μ΄μ©
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#define IS_EVEN(n) ((n) % 2 == 0)
i = MAX(j+k, m-n);
if (IS_EVEN(i)) {
++i;
}
μμ μμμ²λΌ 맀κ°λ³μ 맀ν¬λ‘λ κ°λ¨ν ν¨μμ²λΌ μλνκΈ°λ νλ€.
μ’ λ μμλ₯Ό μ΄ν΄λ³΄λ©΄,
#define TOUPPER(c) ('a' <= (c) && (c) <= 'Z' ? (c) - 'a' + 'A' : (c))
#define getchar() getc(stdin)
π 맀κ°λ³μ 맀ν¬λ‘(parameterized macro)μ μ₯μ
1) νλ‘κ·Έλ¨μ΄ μ‘°κΈ λ λΉ¨λΌμ§λ€. ν¨μ νΈμΆμ overheadλ₯Ό νμλ‘ ν μ μλλ°, 맀ν¬λ‘λ κ·Έλ μ§ μλ€.
2) 맀ν¬λ‘λ μΌλ°μ (generic)μ΄λ€. ν¨μ 맀κ°λ³μμ λ¬λ¦¬ νΉμ ν νμ κ°μ§κ³ μμ§ μλ€.
π 맀κ°λ³μ 맀ν¬λ‘(parameterized macro)μ λ¨μ
1) μ»΄νμΌλ μ½λκ° κΈΈμ΄μ§λ€.
2) μ
λ ₯λ³μμ νμ νμΈν΄μ£Όμ§ μλλ€.
3) 맀ν¬λ‘λ₯Ό κ°λ¦¬ν€λ ν¬μΈν°λ₯Ό κ°μ§ μ μλ€. (ν¨μλ ν¨μ ν¬μΈν°κ° μ‘΄μ¬)
4) 맀ν¬λ‘κ° μ
λ ₯λ³μλ₯Ό ν λ² μ΄μ νκ°ν μ μλ€. (ν¨μλ ν λ²λ§ νκ°)
#μ°μ°μλ 맀ν¬λ‘ μ λ ₯λ³μλ₯Ό λ¬Έμμ΄ λ¦¬ν°λ΄λ‘ μΉννλ€.
π # μ°μ°μ μ¬μ©
#define PRINT_INT(n) printf(#n " = %d\n", n)
μμ n λμ λ¬Έμμ΄ λ¦¬ν°λ΄μ λ£μ΄μ€λ€.
PRINT_INT(i/j);
λ°λΌμ μ μ½λλ μλμ κ°λ€.
printf("i/j=%d\n", i/j);
##μ°μ°μλ λ ν ν°μ νλμ ν ν°μΌλ‘ λΆμ¬ μ€λ€.
π ## μ°μ°μ μ¬μ©
#define MK_ID(n) i##n
int MK_ID(1);
int MK_ID(2);
μ κ°μ΄ μμ±ν΄μ£Όλ©΄ μ μ²λ¦¬ μ΄νμλ
int i1;
int i2;
κ° λλ€.
max ν¨μμ μ μλ₯Ό κ°λ 맀ν¬λ‘λ₯Ό μμ±νλ©΄, μΌμΌμ΄ λ§λ€μ§ μκ³ μ¬λ¬ νμ λ°λλ‘ ν μ μλ€.
맀ν¬λ‘λ‘ λ κ° μ΄μμ maxν¨μλ₯Ό λ§λ€ μ μλλ°, ##μ°μ°μλ‘ κ° maxλ§λ€ μλ‘ λ€λ₯Έ μ΄λ¦μ λ§λ€μ΄ ν΄κ²°ν΄μ€ μ μλ€.
#define GENERIC_MAX(type) type type##_max(type x, type y) { return x > y ? x : y; }
λ§μ½ floatν λ³μλ₯Ό μ¬μ©ν maxν¨μκ° νμνλ©΄ μλμ κ°μ΄ μ μν μ μλ€.
GENERIC_MAX(float)
κ·ΈλΌ μ μ²λ¦¬κΈ°μ μν΄ μλμ κ°μ΄ λ°λλ€
float float_max(float x, float y)
{
return x > y ? x : y;
}
π 맀ν¬λ‘μ μ μ©λλ κ·μΉ
1) 맀ν¬λ‘ λ체 λͺ©λ‘μ΄ λ€λ₯Έ 맀ν¬λ‘μ λ°λμ κ°κ³ μμ μ μλ€.
#define PI (3.14159)
#define TWO_PI (2 * PI)
2) μ μ²λ¦¬κΈ°λ μλ³μ, λ¬Έμν μμ, λ¬Έμμ΄ λ¦¬ν°λ΄μ μΌλΆμΈ 맀ν¬λ‘ μ΄λ¦μ 무μνλ€.
#define SIZE (256)
int BUFFER_SIZE;
μ μ½λμ κ²½μ° BUFFER_SIZEλ μ μ²λ¦¬μ μν₯μ λ°μ§ μλλ€.
3) 맀ν¬λ‘μ μ μλ λ³΄ν΅ μ μλ ν΄λΉ νμΌ μ 체μ μ μ©λλ€.
4) λκ°κ² μ¬μ μλ₯Ό νμ§ μλ μ΄μ μ¬μ μλ λΆκ°λ₯νλ€.
5) #undef μ§μμμ μν΄ λ―Έμ μ λ μλ μλ€.
μλμ½λλ νμ¬ μ μλ 맀ν¬λ‘ Nμ μμ νλ€.
#undef N
맀ν¬λ‘μλ μκ΄νΈλ₯Ό λ§μ΄ μ¨μ£Όλκ²μ΄ μ’λ€.
1) λ체λͺ©λ‘μ μ°μ°μκ° ν¬ν¨λμ΄ μμΌλ©΄ λ°λμ λ체λͺ©λ‘μ μκ΄νΈλ‘ κ°μΈμ£Όμ΄μΌ νλ€.
#define TWO_PI (2 * 3.14159)
2) 맀ν¬λ‘κ° λ§€κ°λ³μκ° μμ κ²½μ° λ§€κ°λ³μλ₯Ό λͺ¨λ κ΄νΈλ‘ κ°μΈμ£Όμ΄μΌ νλ€.
#define SCALE(x) ((x)) * 10)
μΌνλ₯Ό μ΄μ©ν΄ λ체λͺ©λ‘μ ννμμ μ°μμ²΄λ‘ λ§λ€ μ μλ€.
π λ¬Έμμ΄μ μ½μ λ€μ μΆλ ₯μ ν΄μ£Όλ 맀ν¬λ‘ - (1)
#define ECHO(s) (gets(s), puts(s))
μ΄λ κ² ν΄μ ECHOλ₯Ό λ§μΉ ν¨μμΈ κ²μ²λΌ μ¬μ©ν μ μλ€.
ECHO(str); /* (gets(str), puts(str)); μ΄ λλ€ */
κ·Έλ¬λ μΌνλ‘λ ννμμ΄ μλλΌ κ΅¬λ¬Έμ μ°κ²°μν¬ μλ μλ€. ꡬ문μ μ°κ²°μν€λ €λ©΄ do 루νλ₯Ό μ΄μ©ν΄μΌ νλ€.
π λ¬Έμμ΄μ μ½μ λ€μ μΆλ ₯μ ν΄μ£Όλ 맀ν¬λ‘ - (2)
#define ECHO(s) \
do{ \
gets(s); \
puts(s); \
} while (0)
μΈλ―Έμ½λ‘ μ΄ μλ€λ μ μ λμ¬κ²¨ 보μ.
ECHOλ₯Ό μ¬μ©ν λ λ°λμ μΈλ―Έμ½λ‘ μ μ΄μ©ν΄ doλ¬Έμ μμ±μμΌμ£Όμ΄μΌ νλ€.
ECHO(str); /* do { gets(str); puts(str); } while (0); μ΄ λλ€*/
π Cμμ μ¬μ μ μλ 맀ν¬λ‘λ€
μ΄λ¦ | μ€λͺ |
---|---|
__LINE__ | μ»΄νμΌνλ νμΌμ μ€ λ²νΈ |
__FILE__ | μ»΄νμΌνλ νμΌ μ΄λ¦ |
__DATE__ | μ»΄νμΌ λ μ§ ("Mmm dd yyyy"μ νμ) |
__TIME__ | μ»΄νμΌ μκ° ("hh:mm:ss"μ νμ) |
__STDC__ | λ§μ½ μ»΄νμΌλ¬κ° Cνμ€(C89 νΉμ C99)μΌμ 1μ |
π Cμμ μ¬μ μ μλ 맀ν¬λ‘λ€
μ΄λ¦ | μ€λͺ |
---|---|
__STDC_HOSTED__ | νΈμ€νΈ μνμ΄λΌλ©΄ 1, λ 립μ μ΄λΌλ©΄ 0 |
__STDC_VERSION__ | μ§μνλ Cμ νμ€ λ²μ |
__STDC__ | IEC 60559 κ³ μ μμμ μ°μ μ μ§μν μ 1 |
__TIME__ | IEC 60559 볡μμ μ°μ μ μ§μν μ 1 |
__STDC__ | wchar_tμ κ°μ΄ νΉμ λ λμ μμ΄ ISO 10646 νμ€μ λ§μ‘±ν μ yyyymmL |
C99μμλ 맀ν¬λ‘μ λͺ¨λ μ λ ₯λ³μκ° λΉμ΄μμ μ μλ€. μ΄ κ²½μ° μΌνλ₯Ό μ΄μ©νμ¬ μ΄λ€ μ λ ₯λ³μκ° μλ΅λμλμ§ νμνλ€.
#define ADD(x,y) (x+y)
μμ κ°μ΄ μ μΈν κ²½μ°
i = ADD(, k);
μμ ꡬ문μ λ€μκ³Ό κ°λ€
i = ( + k);
λΉ μ λ ₯λ³μκ° #μ νΌμ°μ°μμ κ²½μ°μλ ""(λΉ λ¬Έμμ΄)μ΄ λλ€.
#define MK_STR(x) #x
...
char empty_string[] = MK_STR();
μμ ꡬ문μ μ μ²λ¦¬κΈ°μ μν΄ μλμ κ°μ΄ λ°λλ€.
char empty_string[] = "";
λΉ μ λ ₯λ³μκ° ##μ νΌμ°μ°μμ κ²½μ°μλ μμΉ νμμ ν ν°μΌλ‘ λ체λμ΄ μ‘΄μ¬νλ μ λ ₯λ³μμ λ§λλ©΄ μ¬λΌμ§λ€.
#define JOIN(x, y, z) x##y##z
...
int JOIN(a, b, c);
int JOIN(a, b, );
int JOIN(a, , c);
int JOIN(, , c);
μμ ꡬ문μ μ μ²λ¦¬κΈ°μ μν΄ μλμ κ°μ΄ λ°λλ€.
int abc;
int ab;
int ac;
int c;
C99μμλ 무μ νμ μ λ ₯λ³μλ₯Ό λ°μ μ μλ€. μ΄ κΈ°λ₯μ μ£Όλ λͺ©μ μ printfλ scanfμ κ°μ΄ κ°λ³ κΈΈμ΄ μ λ ₯λ³μλ€μ λ°λ ν¨μμ μ¬μ©ν΄μ£ΌκΈ° μν΄μ μ΄λ€.
#define TEST(condition, ...) ((condition) ? \
printf("Passed test: %s\n", #condition) : \
printf(__VA_ARGS__))
... (μλ΅λΆνΈ(ellipsis)) : 맀ν¬λ‘μ 맀κ°λ³μ λͺ©λ‘μμ λ§μ§λ§μ μμΉνλ©°, μΌλ°μ μΈ λ§€κ°λ³μκ° μ‘΄μ¬ν μ μλ΅ λΆνΈ μ΄μ μ λμ¨λ€
__VA_ARGS__ : κ°λ³ κΈΈμ΄ μ λ ₯λ³μλ₯Ό κ°λ 맀ν¬λ‘μ λ체λͺ©λ‘μμλ§ λμ¬ μ μλ νΉμν μλ³μμ΄λ€. μλ΅λΆνΈμ ν΄λΉνλ λͺ¨λ μ λ ₯λ³μλ₯Ό μλ―Ένλ€
TEST : μ΅μν λ κ°μ μ
λ ₯λ³μλ₯Ό νμλ‘ νλ€.
첫λ²μ¬ μ
λ ₯λ³μλ condition 맀κ°λ³μμ λμνκ³ , λλ¨Έμ§ μ
λ ₯λ³μλ€μ μλ΅ λΆνΈμ λμνλ€.
π TEST 맀ν¬λ‘μ μ€μ μ©λ²
TEST(voltage <= max_voltage, "Voltage %d exceeds %d\n", voltage, max_voltage);
λ§μ½ voltage <= max_voltageλΌλ©΄
Passed test : voltage <= max_voltageλ₯Ό μΆλ ₯,
voltage > max_voltage λΌλ©΄
Voltage 125 exceeds 120 μ μΆλ ₯ν κ²μ΄λ€.
__func__ μλ³μλ νμ¬ μ€νλλ ν¨μμ μ΄λ¦μ μ μ₯νκ³ μλ λ¬Έμμ΄ λ³μμ²λΌ νλνλ€.
static const char \__func__[] = "function-name";
μ΄λ¬ν μλ³μκ° μ‘΄μ¬νκΈ° λλ¬Έμ λ€μκ³Ό κ°μ λλ²κΉ 맀ν¬λ‘λ₯Ό μμ±ν΄μ€ μ μλ€.
#define FUNCTION_CALLED() printf("%sκ° νΈμΆλ¨\n", __func__);
#define FUNCTION_RETURNS() printf("%sκ° λ°νν¨\n", __func__);
void f(void)
{
FUNCTION_CALLED(); /* "fκ° νΈμΆλ¨"μ μΆλ ₯ν¨ */
FUNCTION_RETURNS(); /* "fκ° λ°νν¨"μ μΆλ ₯ν¨ */
}
#if - #endif μ§μ μ΄μ©νλ©΄ μ½λμμμλ λ¨μμλλΌλ μν©μ λ°λΌ μ»΄νμΌ νμ§ μμ μ μλ€.
μλ μ½λμ κ²½μ° DEBUG κ°μ΄ 1μ΄λ―λ‘ μ€νλλ©°, DEBUGκ°μ 0μΌλ‘ λ°κΎΈλ©΄ μ»΄νμΌλμ§ μλλ€.
#define DEBUG 1
#if DEBUG
printf("iμ κ° : %d\n", i);
printf("jμ κ° : %d\n", j);
#endif
ν΄λΉ μλ³μκ° μ μλ 맀ν¬λ‘μΌ κ²½μ° definedλ κ° 1μ λ΄λ³΄λ΄κ³ , μλλΌλ©΄ 0μ λ΄λ³΄λΈλ€.
μ¦ ν΄λΉ μλ³μκ° λ§€ν¬λ‘λ‘μ μ μλμλμ§λ₯Ό νλ¨νλ μ°μ°μμ΄λ€.
#if define(DEBUG)
β¦
#endif
λ§μ½ DEBUGκ° λ§€ν¬λ‘λ‘μ μ μκ° λμ΄μλ€λ©΄ #if ~ #endif μ¬μ΄ λ¬Έμ΄ μ€νλλ€.
#ifdef μ§μμλ μλ³μκ° νμ¬ λ§€ν¬λ‘λ‘ μ μλμ΄μλμ§ μ¬λΆλ₯Ό νμΈνλ€.
#ifdef identifier
...
#endif
μλ³μκ° μ μλμ΄ μλ€λ©΄ #ifdef ~ #endif μ¬μ΄ λ¬Έμ΄ μ€νλλ€. μ΄λ μμ λ³Έ #ifμ defined μ°μ°μλ₯Ό μ΄μ©ν΄μλ ν μ μλ€.
#ifndefλ #ifdefμλ λ°λλ‘ μλ³μκ° νμ¬ λ§€ν¬λ‘μ μ μλμ΄μμ§ μμλμ§μ μ¬λΆλ₯Ό νμΈνλ€.
#if, #ifdef, #ifndef λ±κ³Ό λλΆμ΄ #elif, #elseλ₯Ό μ¬μ©νμ¬ μ¬λ¬ 쑰건λ€μ νλ³ν΄μ€ μ μλ€.
π μ¬λ¬ κΈ°κ³λ μ΄μ체μ μ νΈνμ΄ λλ νλ‘κ·Έλ¨μ μμ±ν λ
#if defined(WIN32)
β¦
#elif defined(MAC_OS)
β¦
#elif defined(LINUX)
β¦
#endif
μ΄λ₯Ό μ΄μ©ν΄μ μ΄λ μ΄μ체μ μμ λμκ°λμ§ νμλ₯Ό ν΄μ€ μ μλ€.
π λ€μν μ»΄νμΌλ¬μμ μ»΄νμΌν μ μλ νλ‘κ·Έλ¨μ μμ±ν λ
μλ‘ λ€λ₯Έ μ»΄νμΌλ¬λ€μ μλ‘ λ€λ₯Έ Cλ²μ μ μΈμν μ μκΈ° λλ¬Έμ μ€λλ μ»΄νμΌμ μ¬μ©ν΄μΌ ν λλ __STDC__ 맀ν¬λ‘ λ±μ μ΄μ©ν΄μΌ νλ€.
#if __STDC__
Function prototypes
#else
Old-style function declarations
#endif
π 맀ν¬λ‘μ κΈ°λ³Έ μ μλ₯Ό λ΄λ €μ€ λ
μ‘°κ±΄λΆ μ»΄νμΌμ 맀ν¬λ‘κ° νμ¬ μ μλμλμ§λ₯Ό νλ¨νκ³ κ·Έμ λ°λ₯Έ νλμ ν΄μ€ μ μλ€. μλ μ½λλ BUFFER_SIZEκ° μ μλμ§ μμλ€λ©΄ μ μλ₯Ό νλ€.
#ifndef BUFFER_SIZE
#define BUFFER_SIZE 256
#endif
π μΌμμ μΌλ‘ μ£Όμμ ν¬ν¨ν μ½λλ₯Ό μμ¨ λ
#if 0
Lines containing comments
#endif
#error, #line, #pragma μ§μμ
#error message
μ μ²λ¦¬κΈ°λ #error μ§μμλ₯Ό λ§λλ©΄ messageλ₯Ό λ°λμ ν¬ν¨νλ μ€λ₯ 문ꡬλ₯Ό μΆλ ₯νλ€. μ€λ₯ 문ꡬμ μ νν μμμ μ»΄νμΌλ¬λ§λ€ λ€λ₯΄λ€.
π #error μ¬μ© μμ
#if defined(WIN32)
β¦
#elif defined(MAC_OS)
β¦
#elif defined(LINUX)
β¦
#else
#error νΉμ λ μ΄μ체μ κ° μμ΅λλ€
#endif
#line μ§μμλ νλ‘κ·Έλ¨μ μ€μ λ²νΈλ₯Ό λΆμ¬νλ λ²μ λ°κΏ λ μ¬μ©νλ€. λν μ»΄νμΌλ¬κ° λ€λ₯Έ μ΄λ¦μ νμΌμ μ½κ³ μλλ‘ μ°©κ°νκ² λ§λ€ μ μλ€.
#lineμ λ κ°μ§ μμμ κ°λλ€.
1) #line μ§μμ (1λ² μμ)
#line n
μ΄ μ§μμλ νλ‘κ·Έλ¨μμ λ€μ μ€λ€μ΄ n, n+1, n+2 μμΌλ‘ λ²νΈκ° λ³νκ² λ§λ λ€.
2) #line μ§μμ (2λ² μμ)
#line n "file"
μ§μμ μ΄νμ λμ¨ μ€λ€μ "file"(νμΌλͺ )μ κ°λ νμΌμμ μ¨ κ²μΌλ‘ μ·¨κΈνλ€.
π #line μ¬μ© μμ
#line 10 "bar.c"
μ»΄νμΌλ¬κ° foo.cμ 5λ² μ€μμ μ€λ₯λ₯Ό νμ§ν κ²½μ° μ€λ₯ 문ꡬλ foo.cνμΌμ 5λ²μ§Έ μ€μ΄ μλ bar.c νμΌμ 13λ²μ§Έ μ€μμ μ€λ₯κ° λ¬λ€κ³ μΈμνλ€.
13λ²μ§Έ μ€μΈ μ΄μ λ μ§μμκ° foo.cμ 1λ² μ€μ μ°¨μ§νμ¬ foo.cκ° 2λ² μ€λΆν° μμνκΈ° λλ¬Έμ΄λ€.
#line μ§μμλ μ£Όλ‘ C μ½λλ₯Ό μΆλ ₯ν΄μ£Όλ νλ‘κ·Έλ¨μμ μ¬μ©νλ€. μ μΌ λνμ μΈ μμλ‘λ yacc(μ»΄νμΌλ¬μ μ»΄νμΌλ¬)κ° μλ€.
#pragma μ§μμλ μ»΄νμΌλ¬κ° νΉμ νλμ νλλ‘ λΆννκ² λ§λλ λ°©λ²μ΄λ€.
C99λ #pragma μ§μμμ μμ΄ μΈ μ μλ _Pragma μ°μ°μλ₯Ό μ 곡νλ€.