source

매크로가 정의되어 있지 않다면 왜 매크로만 정의합니까?

factcode 2023. 1. 15. 17:14
반응형

매크로가 정의되어 있지 않다면 왜 매크로만 정의합니까?

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

반응형