매크로가 정의되어 있지 않다면 왜 매크로만 정의합니까?
C코드 베이스 전체에 걸쳐 모든 매크로가 다음과 같이 정의되어 있습니다.
#ifndef BEEPTRIM_PITCH_RATE_DEGPS
#define BEEPTRIM_PITCH_RATE_DEGPS 0.2f
#endif
#ifndef BEEPTRIM_ROLL_RATE_DEGPS
#define BEEPTRIM_ROLL_RATE_DEGPS 0.2f
#endif
#ifndef FORCETRIMRELEASE_HOLD_TIME_MS
#define FORCETRIMRELEASE_HOLD_TIME_MS 1000.0f
#endif
#ifndef TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS
#define TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS 50.0f
#endif
매크로만 정의하는 것이 아니라 이러한 정의 검사를 수행하는 이유는 무엇입니까?
#define BEEPTRIM_PITCH_RATE_DEGPS 0.2f
#define BEEPTRIM_ROLL_RATE_DEGPS 0.2f
#define FORCETRIMRELEASE_HOLD_TIME_MS 1000.0f
#define TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS 50.0f
웹 어디에도 이 관행이 설명되어 있지 않습니다.
이것에 의해, 다음의 컴파일시에 매크로를 덮어쓸 수 있습니다.
gcc -DMACRONAME=value
헤더 파일의 정의는 기본값으로 사용됩니다.
코멘트에서 말한 것처럼, 이 상황을 상상해 주세요.
후우
#define FOO 4
def.h
#ifndef FOO
#define FOO 6
#endif
#ifndef BAR
#define BAR 4
#endif
바
#include "foo.h"
#include "defs.h"
#include <stdio.h>
int main(void)
{
printf("%d%d", FOO, BAR);
return 0;
}
인쇄하다44
.
단, 조건부로ifndef
거기에 없으면, 결과는 매크로 재정의의 컴파일 경고가 되어, 인쇄됩니다.64
.
$ gcc -o bar bar.c
In file included from bar.c:2:0:
defs.h:1:0: warning: "FOO" redefined [enabled by default]
#define FOO 6
^
In file included from bar.c:1:0:
foo.h:1:0: note: this is the location of the previous definition
#define FOO 4
^
콘텍스트는 알 수 없지만 매크로 정의에 의해 설정된 값을 덮어쓸 수 있도록 사용자에게 제공할 수 있습니다.사용자가 이러한 매크로 중 하나에 대해 다른 값을 명시적으로 정의하면 여기서 사용하는 값 대신 해당 값이 사용됩니다.
예를 들어 g++에서는-D
값을 매크로에 전달하기 위해 컴파일 중에 플래그를 지정합니다.
이는 헤더 파일 사용자가 자신의 코드 또는 컴파일러의 -D 플래그에서 정의를 덮어쓸 수 있도록 하기 위해 수행됩니다.
모든 C 프로젝트는 여러 원본 파일에 있습니다.단일 소스 파일에 대해 작업할 때는 체크가 실제로 의미가 없는 것처럼 보이지만 대규모 C 프로젝트에서 작업할 때는 상수를 정의하기 전에 기존 정의를 확인하는 것이 좋습니다.아이디어는 간단합니다. 특정 소스 파일에 상수가 필요하지만 이미 다른 파일에 정의되어 있을 수 있습니다.
사용자가 컴파일 및 작업을 수행할 수 있는 기본 사전 설정을 사용자에게 제공하는 프레임워크/라이브러리에 대해 생각할 수 있습니다.이러한 정의는 다른 파일에 분산되어 있으며 최종 사용자는 해당 값을 구성할 수 있는 config.h 파일을 포함하도록 권장합니다.사용자가 일부 정의를 잊어버린 경우 사전 설정 때문에 시스템이 계속 작동할 수 있습니다.
사용.
#ifndef BEEPTRIM_PITCH_RATE_DEGPS
#define BEEPTRIM_PITCH_RATE_DEGPS 0.2f
#endif
사용자는 명령줄 인수를 사용하여 매크로 값을 정의할 수 있습니다(gcc/clang/VS).-DBEEPTRIM_PITCH_RATE_DEGPS=0.3f
.
또 다른 중요한 이유가 있다.프리프로세서 매크로를 다르게 정의하면 오류가 발생합니다.다른 SO 질문에 대한 답변을 참조하십시오.미포함#ifndef
주세요.합니다.-DBEEPTRIM_PITCH_RATE_DEGPS=0.3f
는 컴파일러 호출에서 명령줄 인수로 사용됩니다.
언급URL : https://stackoverflow.com/questions/32398612/why-only-define-a-macro-if-its-not-already-defined
'source' 카테고리의 다른 글
Java 8에서의 스플리터, 수집기 및 스트림에 대해서 (0) | 2023.01.15 |
---|---|
단일 컬럼에 대해 apply() 함수를 사용하려면 어떻게 해야 합니까? (0) | 2023.01.15 |
php에서 비트마스크를 구현하려면 어떻게 해야 하나요? (0) | 2023.01.15 |
상태를 업데이트하지 않는 Vuex 변환 (0) | 2023.01.15 |
php에 사전이 있나요? (0) | 2023.01.15 |