C에서 런타임에 매크로 변경
매크로를 정의했습니다.하지만 이 값은 조건에 따라 런 타임에 변경해야 합니다.어떻게 구현할 수 있습니까?
매크로는 소스 파일이 컴파일하기도 전에 값에 따라 전처리기로 대체됩니다.실행 시 매크로 값을 변경할 수 있는 방법은 없습니다.
여러분이 이루고자 하는 목표에 대해 조금만 더 설명해 주신다면 틀림없이 매크로를 포함하지 않은 다른 문제 해결 방법이 있을 것입니다.
매크로 자체를 변경할 수는 없지만 매크로를 포함하는 식의 값을 변경할 수도 있습니다.아주 어리석은 예를 들자면:
#include <stdio.h>
#define UNCHANGEABLE_VALUE 5
#define CHANGEABLE_VALUE foo
int foo = 5;
int main() {
printf("%d %d\n", UNCHANGEABLE_VALUE, CHANGEABLE_VALUE);
CHANGEABLE_VALUE = 10;
printf("%d %d\n", UNCHANGEABLE_VALUE, CHANGEABLE_VALUE);
}
따라서 질문에 대한 답은 매크로를 사용하는 코드에 변경 내용이 어떤 영향을 미치기를 원하느냐에 따라 달라집니다.
물론이야.5
는 컴파일 시간 상수인 반면foo
그렇지 않아요, 그러니 당신이 사용할 계획이라면CHANGEABLE_VALUE
로서case
라벨이든 뭐든.
C 소스 번역에는 두 단계(사실 더 많은)가 있다는 것을 기억하세요.처음에는 매크로가 확장됩니다.이 모든 것이 끝나면, 프로그램은 5.1.1.2/2의 표현대로 "동사적으로 그리고 의미적으로 분석"됩니다.이 두 단계는 종종 "사전 처리"와 "컴플리케이션"이라고 불립니다. (모호하게도 번역의 전체 과정은 종종 "컴플리케이션"이라고도 합니다.)다른 작업을 수행하기 전에 "컴파일러"가 필요에 따라 "프리프로세서"를 실행하는 별도의 프로그램으로 구현할 수도 있습니다.따라서 런타임은 매크로의 확장 범위를 변경하기에는 너무 늦습니다.
그럴수는 없어요.매크로는 코드가 컴파일되기도 전에 발생하는 Preprocessor에 의해 확장됩니다.그것은 순수하게 텍스트로 대체된 것입니다.
런타임에 변경해야 할 사항이 있으면 매크로를 실제 함수 호출로 대체하십시오.
그럴수는 없어요.
매크로는 컴파일 자체 전에 전처리기에 의해 해결되므로, 매크로 내용은 사용자가 사용하는 곳에 직접 복사됩니다.
그래도 매개변수를 사용하여 원하는 조건문을 삽입하거나 호출 범위 접근 가능 변수를 사용할 수 있습니다.
단일 값을 변경하려면 글로벌 스코프 변수를 사용하는 것이 좋습니다.(macro의 집중적인 사용으로)
하고 싶은 일에 따라 여러 가지 방법으로 할 수 있습니다.
매크로 대신 전역 변수
// someincludefile.h
extern static int foo;
// someincludefile.c
static int foo = 5;
// someotherfile.c
#include "someincludefile.h"
printf("%d\n", foo); // >> 5
foo = -5;
printf("%d\n", foo); // >> -5
토글할 수 있는 조건
// someincludefile.h
extern static int condition;
#define FOO1 (5)
#define FOO2 (-5)
#define FOO (condition ? (FOO1) : (FOO2))
// someincludefile.c
static int condition = 1;
// someotherfile.c
#include "someincludefile.h"
printf("%d\n", FOO); // >> 5
condition = 0;
printf("%d\n", FOO); // >> -5
로컬 및 동적으로 평가되는 상태
// someincludefile.h
#define CONDITION (bar >= 0)
#define FOO1 (5)
#define FOO2 (-5)
#define FOO ((CONDITION) ? (FOO1) : (FOO2))
// someotherfile.c
#include "someincludefile.h"
int bar = 1;
printf("%d\n", FOO); // >> 5
bar = -1;
printf("%d\n", FOO); // >> -5
마지막 하나에서는 코드가 로컬 범위에 있는 것처럼 조건이 평가되므로 로컬 변수 및/또는 매개 변수를 사용할 수 있지만 원하는 경우 전역 변수를 사용할 수도 있습니다.
언급URL : https://stackoverflow.com/questions/7572872/changing-a-macro-at-runtime-in-c
'sourcecode' 카테고리의 다른 글
jQuery parent(), parent() 및 가장 가까운() 함수 간의 차이 (0) | 2023.11.04 |
---|---|
이전 커밋이 아닌 커밋 수정 (0) | 2023.11.04 |
"WARn Can't can't decision-length of response body"는 무엇을 의미하며 어떻게 제거해야 합니까? (0) | 2023.11.04 |
전원 셸 및 오류 ConvertTo-SecureString : 키가 지정된 상태에서 사용할 수 없도록 유효하지 않음을 사용하여 재사용을 위한 자격 증명 저장 (0) | 2023.10.30 |
C의 함수명은 어떤 타입입니까? (0) | 2023.10.30 |