ProgramingTip

전 처리기 토큰을 공유로 변환

bestdevel 2020. 12. 7. 20:29
반응형

전 처리기 토큰을 공유로 변환


전 처리기 토큰을 공유로 변환하는 방법을 찾고 있습니다.

특히 어딘가에 있습니다.

#define MAX_LEN 16

버퍼 오버런을 방지하기 위해 사용하고 싶습니다.

char val[MAX_LEN+1]; // room for \0
sscanf(buf, "%"MAX_LEN"s", val);

나는 같은 일을 수행하는 다른 방법에 열려 표준 라이브러리에 해당됩니다.


본문으로 http://www.decompile.com/cpp/faq/file_and_line_error_string.htm을 참조 하십시오 .

#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)

그래서 당신의 문제는 sscanf(buf, "%" TOSTRING(MAX_LEN) "s", val);


온라인에서 답변을 찾았습니다.

#define VERSION_MAJOR 4
#define VERSION_MINOR 47

#define VERSION_STRING "v" #VERSION_MAJOR "." #VERSION_MINOR

위의 내용은 작동하지 않지만 내가하고 싶은 작업을 보여줍니다. 즉, VERSION_STRING을 "v4.47"로 만듭니다.

다음과 같이 사용하십시오.

#define VERSION_MAJOR 4
#define VERSION_MINOR 47

#define STRINGIZE2(s) #s
#define STRINGIZE(s) STRINGIZE2(s)
#define VERSION_STRING "v" STRINGIZE(VERSION_MAJOR) \
"." STRINGIZE(VERSION_MINOR)

#include <stdio.h>
int main() {
    printf ("%s\n", VERSION_STRING);
    return 0;
}

오래 작동합니다.

 sscanf(buf, "%" #MAX_LEN "s", val);

"이중 확장"이 필요합니다.

 #define STR1(x)  #x
 #define STR(x)  STR1(x)
 sscanf(buf, "%" STR(MAX_LEN) "s", val);

이중 확장 화 매크로 트릭을 확장합니다. 아니면 그냥

#define MAX_LEN    16
#define MAX_LEN_S "16"

char val[MAX_LEN+1];
sscanf(buf, "%"MAX_LEN_S"s", val);

동기화 상태를 유지합니다. (그것은 약간 귀찮지 만 정의가 서로 옆에있는 한 아마도 기억할 것입니다.)

사실이 특별한 경우에는 strncpy충분 하지 않습니까?

strncpy(val, buf, MAX_LEN);
val[MAX_LEN] = '\0';

만약 그렇다면 printf, 이것은 더 쉬울 것입니다 :

sprintf(buf, "%.*s", MAX_LEN, val);

위의 "작동"중 일부는 개인적으로 libc에서 제공하는 dreck 대신 간단한 문자열 API를 사용하는 것이 좋습니다. 많은 이식 가능한 API가 있으며, 그중 일부는 프로젝트에 쉽게 포함 할 수 있도록 최적화되어 있으며 ustr 과 같은 일부 는 작은 공간 오버 헤드와 스택 변수를 지원합니다.

참고 URL : https://stackoverflow.com/questions/240353/convert-a-preprocessor-token-to-a-string

반응형