Computer Science
탄탄한 기반 실력을 위한
전공과 이론 지식 모음
Today I Learned!
배웠으면 기록을 해야지
TIL 사진
Flutter 사진
Flutter로 모바일까지
거꾸로캠퍼스 코딩랩 Flutter 앱개발 강사
스파르타코딩클럽 즉문즉답 튜터
카카오테크캠퍼스 3기 학습코치
프로필 사진
박성민
임베디드 세계에
발을 들인 박치기 공룡
임베디드 사진
EMBEDDED SYSTEM
임베디드 SW와 HW, 이론부터 실전까지
ALGORITHM
알고리즘 해결 전략 기록
🎓
중앙대학교 소프트웨어학부
텔레칩스 차량용 임베디드 스쿨 3기
애플 개발자 아카데미 1기
깃허브 사진
GitHub
프로젝트 모아보기
Instagram
인스타그램 사진

TIL

[250903] Day 24 - 임베디드 스터디 ON

sm_amoled 2025. 9. 4. 12:30

들어가며

임베디드 보드 스터디를 시작했다. 후후…

 

들으면 대충 아는 내용들이 나올거라고 생각했는데, 모르는 키워드들이 쏟아지고있다. 근데 하나같이 다 중요한 내용처럼 보임 ㅜㅜ

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);
}
320x100