์๋ ํ์ธ์. ์ค๋ ํฌ์คํ ์์ ๋ค๋ฃฐ ๋ด์ฉ์ constexpr const char * ์ ๋ํ ์ด์ผ๊ธฐ์ ๋๋ค.
์ด ์์ํ๊ฒ ์๊ธด ๋ฌธ๋ฒ์ด ๋ง๋ ํํ์ธ์ง ์ด์ผ๊ธฐํด๋ณด๋๋ก ํ์ฃ .
์ฐ์ , constexpr์ด ๋ญ๊ฐ?
constexpr๋ ์ผ๋ฐ์ ์ผ๋ก const์ ์ ์ฌํ์ง๋ง, const ๋ณด๋ค ์ข์ ๊ฐ๋ ์ผ๋ก ์ฌ๊ฒจ์ง๋๋ค. ์ผ๋จ ์์๋ ์ ์ constexpr๋ฅผ ์ฐ๋ฉด ๋ค์ ์ค๋ ๋ด์ฉ์ด const๋ผ๊ณ ์ ์ธํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ์ ์์ const์ ๋ค๋ฅผ ๊ฒ ์์ฃ .
๊ทธ๋ฌ๋ฉด ๋ ๊ฐ๊ฐ ๊ฐ์ ๊ฑด๊ฐ์?
์๋์ค, constexpr๋ const๋ก ๋์ฒด๊ฐ ๊ฐ๋ฅํ์ง๋ง, const๋ constexpr๋ก ํญ์ ๋์ฒด๋ ์ ์๋ ๊ฒ์ด ์๋๋๋ค. ๋ฌด์จ๋ง์ด๋๋ฉด, constexpr๋ const์ฒ๋ผ ๋ค์ ์ค๋ ์์ด ๋ณํ์ง ์๋ "constant (์์)"์์ ์๋ฏธํ๋ค๋ ์ ์์ ๊ฐ์ง๋ง, ์์ ๊ฐ์ด ๊ฒฐ์ ๋๋ ์๊ฐ์ด ๋ฐ๋์ ์ปดํ์ผํ์์ด์ด์ผํ๋ค๋ ๊ฒ์ด ๋ดํฌ๋์ด์์ต๋๋ค. ๋ฐ๋๋ก const๋ ์ปดํ์ผ ํ์์ผ์๋, ๋ฐํ์์ผ์๋ ์๋ค๋ ๋ฐ์์ ์ฐจ์ด๊ฐ ์์ฃ .
constexpr const char*์ ๋ง๋ ํํ์ผ๊น?
๊ทธ๋ฌ๋ฉด ์ด์ํฉ๋๋ค. constexpr const char*๋ผ๋ ํํ์ ๋ง์น const const char*์ฒ๋ผ ๋ณด์ด์์์? ๊ทธ๋ ๋ค๋ฉด ์ด ํํ์ด ๋ง๋๊ฑธ๊น์? ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ constexpr๊ฐ ์์ํ๋ (์์์ด๋ผ๋ ํํ์ด ๋ง๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค๋ง) ๊ฒ์ const char* ์ ์ฒด๋ผ๋ ์ ์ ๋๋ค. ์ฆ ๋ค์ ์ค๋ ํฌ์ธํฐ ํ์ ์ const๋ก ๋ง๋ ๋ค๋ ๊ฑฐ์ฃ .
์ด๋ฅผ ๋ค์ ์จ๋ณด๋ฉด constexpr const char*๋ const char* const์ ๊ฐ๋ค๋ ๋ง์ด ๋ฉ๋๋ค. (์ฐธ๊ณ ๋ก, constexpr๋ ๋ค์ * ๋ค์ ์๋ const์ ๋๋ค.) ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ์ง๋ฌธ์ ๋ํ ๋ต์ ํด๋ณด์๋ฉด "๋ค, ๋ง๋ ํํ์ ๋๋ค."
๊ทธ๋ ๋ค๋ฉด, const char* const ๋ ์ด๋ค ์๋ฏธ์ผ๊น?
const char * ์ char * const์ ์ฐจ์ด์ ๋ํด์ ์๊ณ ๊ณ์ ๊ฐ์? ์๊ณ ๊ณ์๋ค๋ฉด ์ด์ผ๊ธฐ๊ฐ ์ฌ์์ง ๊ฒ ๊ฐ์ต๋๋ค. ํ์ง๋ง ํน์ ์ด ๋์ ์ฐจ์ด์ ์ด ๊ฐ๋ฌผ๊ฐ๋ฌผํ์ ๋ถ์ ์ํด ๋จผ์ ์ค๋ช ํ๊ณ ๋์ด๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค.
cost char * vs. char* const
์ผ๋จ, char *๋ ์บ๋ฆญํฐ ํฌ์ธํฐ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ const ๋ "constant (์์)"์ ์ค์๋ง๋ก, const๊ฐ ์ ์ฉ๋ ๋์์ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋ง๋ค๊ฒ ๋ค๋ ์๋ฏธ๋ฅผ ๋ดํฌํฉ๋๋ค. ํ์ง๋ง const์ ์์น๊ฐ ์ด๋์ ๋ถ๋๋์ ๋ฐ๋ผ์ ์ด const๋ผ๋ ๋ ์์ด ์ด๋์ ์ ์ฉ๋๊ณ ์๋์ง๊ฐ ๋ฌ๋ผ์ง๋๋ค.
const char*
๋ (const char)*๋ผ๊ณ ์ฝ์ผ๋ฉด ํธํฉ๋๋ค. ์ฆ, constant character์ ํฌ์ธํฐ๋ผ๋ ๋ป์ด์ฃ . ๋ค์ ๋งํด์,
const char * pA = "ABC"; ๋ผ๋ฉด ์ด pA์ ๋ด์ฉ์ด const๋ผ๋ ๋ง์ ๋๋ค. "ABC" ์์ฒด๊ฐ ๊ฐ์ด ์์ ๋ ์ ์๋ค๋ ๊ฒ์ ๋ดํฌํ์ฃ .
char a = 'A';
char b = 'B';
const char* ptr = &a;
*ptr = 'B'; // error
ptr = &b; // valid
char* const
๋ char *๊ฐ const๋ผ๋ ์๋ฏธ์ ๋๋ค. ๋ค์ ๋งํด์, ํฌ์ธํฐ ๋ณ์ ์์ฒด์ const๊ฐ ์ ์ฉ๋๋ค๋ ๋ง์ ๋๋ค. ์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๋ฉด, pointer ๋ณ์๊ฐ ์ ์ฅํ๊ณ ์๋ ์ฃผ์๋ฅผ ๋ฐ๊ฟ ์ ์๋ค๋ ๋ป์ ๋๋ค.
char a = 'A';
char b = 'B';
char * const ptr = &a;
ptr = &b; // error
*ptr = 'C'; // valid
const char * const
๋ฐ๋ผ์, const char * const๋ constant character ๊ฐ์ ์ ์ฅํ๋ฉด์ ํด๋น ํฌ์ธํฐ ๋ณ์์ ์ฃผ์ ๊ฐ์ด ๋ฐ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ํ๋ง๋๋ก ๊ฐ์ ์์ ํ์ง๋, ํด๋น ํฌ์ธํฐ ๋ณ์๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์ ์์ฒด๋ฅผ ์ ๋ฐ์ดํธํ์ง๋ ๋ชปํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
const char * const ptr2 = &a;
*ptr2 = "D"; // error
ptr2 = &b; // error
๊ทธ๋ผ ์ฒซ ์ง๋ฌธ์ผ๋ก ๋์๊ฐ๋ณด๊ฒ ์ต๋๋ค. constexpr char* const ๋ ์ด๋ป๊ฒ ์ฐ๋ ๊ฑธ๊น์? ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ ๋ณ๊ฒฝ์ํค์ง ์์ constant character string์ ์ ์ฅํ ๋ ์๋๋ค.
char a = 'T';
char* test = "ABC";
constexpr const char* ptr_ = &a; // error
constexpr const char* ptr_ = test; // error
constexpr const char* ptr_ = 'A'; // error
constexpr const char* ptr_ = "ABC"; // valid
๋ํ์ ์ธ ์ฉ๋ก๋ก ํน์ ํด๋์ค์ ์ด๋ฆ์ ํํํ๊ณ ์ํ ๋ static member variable๋ก ์ ์ธํด์ ์ฌ์ฉํ ์ ์๊ฒ ๋ค์.
class Module
{
public:
static constexpr const char* name = "Module Name";
}
๋
'IN DEPTH CAKE > Coding-WIKI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์ด์ง ํ์ (Binary Search) - ์ค๋ณต๋ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ๊น์ง ์ดํด๋ณด๊ธฐ (12) | 2023.07.24 |
---|---|
[์ฝ๋ฉ] ์ต๋๊ณต์ฝ์ ๊ตฌํ๊ธฐ - ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ (Euclidean Algorithm) (0) | 2023.07.19 |
[๋ชจ์ ๋๊ณ ๋งํด๋ณด์] ์ ๋ ฌ์๊ณ ๋ฆฌ์ฆ (0) | 2023.05.29 |
sphinx-js ๋ก javascript ์ฝ๋ ๋ฌธ์ํํ๊ธฐ (0) | 2023.05.03 |
No module named 'tensorboard' ํด๊ฒฐ (0) | 2023.03.28 |