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
헤더 파일의 정의가 기본값으로 사용됩니다.
답변
댓글에서 말했듯이 다음 상황을 상상해보십시오.
foo.h
#define FOO 4
defs.h
#ifndef FOO
#define FOO 6
#endif
#ifndef BAR
#define BAR 4
#endif
bar.c
#include "foo.h"
#include "defs.h"
#include <stdio.h>
int main(void)
{
printf("%d%d", FOO, BAR);
return 0;
}
인쇄 44
됩니다.
그러나 조건부 ifndef
가없는 경우 결과는 MACRO 재정의에 대한 컴파일 경고가되고 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
컴파일러 호출에서 명령 줄 인수로 사용되는 경우 컴파일러는 오류를 생성해야합니다 .