태그 보관물: c-preprocessor

c-preprocessor

매크로가 아직 정의되지 않은 경우에만 정의하는 이유는 무엇입니까?

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컴파일러 호출에서 명령 줄 인수로 사용되는 경우 컴파일러는 오류를 생성해야합니다 .