전 처리기 토큰을 공유로 변환
전 처리기 토큰을 공유로 변환하는 방법을 찾고 있습니다.
특히 어딘가에 있습니다.
#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
'ProgramingTip' 카테고리의 다른 글
Linux에서는 하나의 zip 파일에 여러 디렉토리를 압축합니다. (0) | 2020.12.07 |
---|---|
Visual Studio Code- 가져 오기 견적 설정 조정 (0) | 2020.12.07 |
GWT와 함께 작동하는 Json <-> Java 합성 화 (0) | 2020.12.07 |
UITableView, cellForRowAtIndexPath 동안 어떤 섹션을 어떻게 알 수 있습니까? (0) | 2020.12.07 |
"void 0"과 "undefined"의 차이 (0) | 2020.12.07 |