들어가며
임베디드 보드 스터디를 시작했다. 후후…
들으면 대충 아는 내용들이 나올거라고 생각했는데, 모르는 키워드들이 쏟아지고있다. 근데 하나같이 다 중요한 내용처럼 보임 ㅜㅜ
GPIO UART SPI I2C ADC PWM VCC 같은 것들을 이제 하나하나 차곡차곡 쌓아나가기 시작해야겠다. 그래야 지금처럼 계속해서 선두를 달릴 수 있으니깐.
오늘의 키워드
언더스코어로 시작하는 변수들은 예약되어있다.
지난 프로젝트를 작성하면서 다양하게 언더스코어 _ 로 시작하는 식별자들을 작성해왔다.
// 헤더파일 포함 패턴
#ifndef __CAT_H__
#define __CAT_H__
...
#endif
// 구조체 이름
typedef struct _my_cat {
...
} my_cat_t
ㅤ
그런데, 언더바 2개 의 의미와 유래가 궁금해서 찾아보다보니 C언어에서는 이렇게 언더스코어로 시작하는 변수명이나 상수명을 최대한 지양해야 한다는 충격적인 말을 보게 되었다. (아니 C++에서는 _ 붙이면 private 처럼 되기에 c에서도 비슷한 뉘앙스로 활용할 수 있는거 아니였냐고)
ㅤ
https://port70.net/~nsz/c/c11/n1570.html#7.1.3
위 링크의 [ 7.1.3 Reserved Identifiers ] 섹션을 보면 다음의 내용이 작성되어있다.
• All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.
• All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces.
ㅤ
언더스코어로 시작하는 이름들은 시스템 예약어이기 때문에, 사용자가 프로그램을 작성할 때는 함부로 사용하면 안된다는 이야기가 담겨있다. 실제로 컴파일러가 사용하는 여러 키워드들이나 라이브러리를 만들 때 이러한 이름들을 사용하고 있고 (ctrl + 클릭을 해서 구현을 찾아가보면 확인할 수 있다 / __file__ 이나 __line__ 같은 이름들도 실제로 확인할 수 있었다.) 혹시 나중에 시스템 상수나 라이브러리 상수와 이름이 충돌해서 문제가 발생할 수 있기 때문에 최대한 사용을 회피해야한다.
ㅤ
그래서 저렇게 상수 define 이나 구조체 내부 이름에 _를 사용하는 것은 좋지 않은 방식이고 앞으로는 매크로 상수는 그냥 Screaming Snake Case로 작성하기 / 구조체 내부 이름은 my_type 처럼 _t를 뺀 것을 이름으로 사용하려고 한다.
ㅤ
값 초기화에는 static 함수
static 변수에 값을 할당하는 과정에서는 매크로 함수를 사용하는게 좋음. 정적 변수에 값을 할당하는 시점에는 아직 함수가 로드되지 않았(을 수 있)기에 함수 결과를 할당하는 방식이 허용되지 않음.
#define DIV2(X) (( X ) / 2 )
int divide2(int x)
{
return x / 2;
}
int main(void)
{
static int a = DIV2(5);
static int b = divide2(5); // << 이건 실행 안됨!
int c = DIV2(5);
int d = divide2(5);
}'TIL' 카테고리의 다른 글
| [250909] Day 30 - 어셈블리를 까보자. (0) | 2025.09.10 |
|---|---|
| [250905] Day 26 - 죽이고싶은 BFS 문제와의 10선 (0) | 2025.09.10 |
| [250902] Day 23 - 이제 내 세상이다 (0) | 2025.09.04 |
| [250901] Day 22 - C언어도 캡슐화가 가능하다고 (0) | 2025.09.01 |
| [250825] Day 15 - 드디어 프로젝트를 시작합니다! (2) | 2025.08.25 |