전처리기 토큰을 문자열로 변환
전처리기 토큰을 문자열로 변환하는 방법을 찾고 있다.
특히, 어디선가 알아냈어:
#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
위 내용은 작동하지 않지만 내가 하고 싶은 것, 즉 VISTARY_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에 나오는 쓰레기통 대신 간단한 문자열 API를 사용하는 것을 추천한다.많은 휴대용 API가 있는데, 그중 일부는 프로젝트에 쉽게 포함되도록 최적화되어 있고, ustr과 같은 일부는 작은 공간 오버헤드와 스택 변수를 지원한다.
내 2센트.
#define MAX_LEN 16
#define AUX_VALUE(x) x
#define QUOTATION_VALUE() "
#define STRINGIFY(x) #x //Ok in all.
//#define STRINGIFY(x) QUOTATION_VALUE()AUX_VALUE(x)QUOTATION_VALUE() //Ok only in VC++
std::string str = STRINGIFY(MAX_LEN);
const char* str2 = STRINGIFY(MAX_LEN);
sscanf(buf, "%" STRINGIFY(MAX_LEN) "s", val);
참조URL: https://stackoverflow.com/questions/240353/convert-a-preprocessor-token-to-a-string
'programing' 카테고리의 다른 글
Linux에서 Java SDK를 설치한 후 찾을 수 있는 위치 (0) | 2022.04.28 |
---|---|
경로가 변경될 때마다 저장하기 위해 돌연변이를 커밋하는 방법 (0) | 2022.04.28 |
vuejs - 구성 요소 간에 웹 사이트 연결 공유 (0) | 2022.04.27 |
시간에 따라 여러 VueJS, @vue/cli 종속 애플리케이션을 유지 관리하는 규정된 방법은 무엇인가? (0) | 2022.04.27 |
API에서 ChartJS가 포함된 VueJs 채우기 (0) | 2022.04.27 |