C and C plus plus - Sizuha/devdog GitHub Wiki

C/C++

static ν•¨μˆ˜

일반 ν•¨μˆ˜μ— static이 λΆ™λŠ” 경우, μ΄λŠ” ν•΄λ‹Ή ν•¨μˆ˜κ°€ ν•΄λ‹Ή 파일 μ•ˆμ—μ„œλ§Œ μ‚¬μš©λ  수 μžˆμŒμ„ λœ»ν•œλ‹€.

/* a.c */
// 이 ν•¨μˆ˜λŠ” a.c λ‚΄μ—μ„œλ§Œ μ‚¬μš©λœλ‹€.
static void testFunc() {
	// ...
}

/* b.c */
// 이 ν•¨μˆ˜λŠ” b.c λ‚΄μ—μ„œλ§Œ μ‚¬μš©λœλ‹€.
static void testFunc() {
	// ...
}

// 이런 μ‹μœΌλ‘œ 같은 ν•¨μˆ˜λͺ…을 μ„ μ–Έν•˜κ³  μžˆμ–΄λ„ νŒŒμΌκ°„μ— 좩돌이 μΌμ–΄λ‚˜μ§€ μ•ŠλŠ”λ‹€.

ν•¨μˆ˜ 포인터

ν•¨μˆ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터 ν˜• μ„ μ–Έ

// Fκ°€ ν•¨μˆ˜ν˜• 포인터 λ³€μˆ˜κ°€ λœλ‹€.
return_type (*F)(arg_type1, arg_type2, ...);

// Fλ₯Ό ν•¨μˆ˜ν˜• νƒ€μž…μœΌλ‘œ μ“Έ 수 μžˆλ‹€.
typedef return_type (*F)(arg_type1, arg_type2, ...);

λ§΄λ²„ν•¨μˆ˜ 포인터 (C++)

return_type (ClassName::*F)(arg_type1, arg_type2, ...);

mutable (C++)

본래 const둜 μƒμˆ˜μ§€μ •λœ κ°μ²΄λŠ” λ°”μ΄λ„ˆλ¦¬ λ‹¨μœ„μ˜ μƒμˆ˜μ„±μ„ κ°€μ§„λ‹€. 말 κ·ΈλŒ€λ‘œ μƒμˆ˜κ°μ²΄μΌ λ•ŒλŠ” 단 1λΉ„νŠΈλ„ 변경이 λΆˆκ°€λŠ₯ν•˜λ‹€.

그런데 μ–΄μ©Œλ©΄ λ°”μ΄λ„ˆλ¦¬ μˆ˜μ€€μ΄ μ•„λ‹ˆλΌ κ°œλ…μ  μˆ˜μ€€μ—μ„œλ§Œ μƒμˆ˜μ„±μ΄ ν•„μš”ν•  μˆ˜λ„ μžˆλ‹€. 즉, 객체 λ°”μ΄λ„ˆλ¦¬ 전체λ₯Ό λ‹€ μƒμˆ˜ν™” ν•  ν•„μš”λŠ” μ—†κ³ , μ‚¬μš©μž μͺ½μ—μ„œ 보기에 μƒμˆ˜μ„±μ΄ μœ μ§€λ˜κ³  μžˆλ‹€κ³  보여지면 그만일 경우. 달리 λ§ν•˜μžλ©΄ μƒμˆ˜ν™”λœ κ°μ²΄μ—μ„œλ„ ν•„μš”μ— λ”°λΌμ„œλŠ” λ‚΄μš©μ΄ 변경될 수 μžˆλ„λ‘ ν•  수 μžˆλ‹€.

λ‹€μŒκ³Ό 같이 μƒμˆ˜μ„±μ„ ν•΄μ œν•  맴버(ν•„λ“œ)λ₯Ό mutable둜 μ„ μ–Έν•œλ‹€.

class X {
private:
	bool m_flag;
	mutable int m_accessCount;
public:
	bool GetFlag() const {
		// μƒμˆ˜ν™”λœ μΈμŠ€ν„΄μŠ€μ—μ„œλ„ mutable둜 μ„ μ–Έλœ λ§΄λ²„λŠ” λ³€κ²½ κ°€λŠ₯.
		m_accessCount++;
		return m_flag;
	}
};

문제 및 ν•΄κ²°

char -> wchar_t λ³€ν™˜

char* λ¬Έμžμ—΄μ„ unicode λ¬Έμžμ—΄(wchar_t*) νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•  λ•ŒλŠ” charν˜•μ΄ signed νƒ€μž…μ΄λΌλŠ” 것에 μ£Όμ˜ν•΄μ•Ό ν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€. 이것과 κ΄€λ ¨ν•΄μ„œ μ œκ°€ κ²½ν—˜ν–ˆλ˜ μ‚½μ§ˆμ˜ κ°„λ‹¨ν•œ 예λ₯Ό ν•˜λ‚˜ λ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

void charToWChar(char src, wchar_t& out_dest) {
    out_dest =(wchar_t)src;// X : μ΄λ ‡κ²Œ ν•˜λ©΄ μ•ˆλ¨!!
}

얼핏보면 별 λ¬Έμ œμ—†μ΄ 잘 λ™μž‘ν•  것 같은 ν•¨μˆ˜μΈλ°, 사싀은 μ€‘λŒ€ν•œ 버그가 μ„œμ‹ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 일단 charλŠ” 1 Byte에 signed(λΆ€ν˜ΈμžˆλŠ”) μ •μˆ˜λ‘œ μ·¨κΈ‰λœλ‹€λŠ” κ±°κ³ , wchar_tλŠ” unsigned short(λΆ€ν˜Έμ—†λŠ” 2 Byte μ •μˆ˜)둜 생각할 수 μžˆλŠ”λ°, μ—¬κΈ°μ„œ src μΈμžκ°€ 음수(-) 값이 λ“€μ–΄μ˜¬ 경우λ₯Ό 생각해 λ΄…λ‹ˆλ‹€.

예λ₯Όλ“€μ–΄ src = -1 이라고 ν• λ•Œ, -1은 λ°”μ΄νŠΈλ‘œ 0xFFκ°€ λ©λ‹ˆλ‹€. μ›λž˜ μ˜λ„λŠ” 0xFF(즉 255)κ°€ κ·ΈλŒ€λ‘œ 2 Byte둜 ν™•μž₯λ˜μ„œ 0x00FFκ°€ λ˜μ–΄μ„œ out_dest에 전달이 λ˜μ–΄μ•Ό ν•˜μ£ .

ν•˜μ§€λ§Œ μ‹€μ œ λ™μž‘μ€ μ „ν˜€ λ‹€λ₯΄κ²Œ μΌμ–΄λ‚©λ‹ˆλ‹€. μš°μ„  -1을 2 Byte둜 ν™•μž₯ μ‹œν‚΅λ‹ˆλ‹€. -1에 λŒ€ν•œ 2 Byte ν‘œν˜„μ€ 0xFFFFκ°€ λ©λ‹ˆλ‹€. 그리고 이것을 unsigned둜 μΈμ‹ν•˜κ³  out_dest에 μ „λ‹¬ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ out_dest에 λŒ€ν•œ 좜λ ₯값은 65535(0xFFFF)κ°€ λ©λ‹ˆλ‹€.

λ”°λΌμ„œ μ›λž˜ μ˜λ„λŒ€λ‘œ λ™μž‘μ‹œν‚€ μœ„ν•΄μ„œλŠ” unsigned char ν˜•μœΌλ‘œ(2 Byte μ •μˆ˜λ‘œ ν™•μž₯λ˜μ§€ μ•Šκ²Œ) νƒ€μž… μΊμŠ€νŒ…μ„ ν•΄μ€˜μ•Ό ν•©λ‹ˆλ‹€.

void charToWChar(char src, wchar_t& out_dest) {
    out_dest =(unsigned char)src;
}