Преобразуйте маркер препроцессора в строку

60
задан Brian Tompsett - 汤莱恩 3 February 2016 в 10:14
поделиться

5 ответов

см. 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);

102
ответ дан pfnuesel 24 November 2019 в 17:39
поделиться

Я нашел ответ онлайн.

#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;
}
21
ответ дан davenpcj 24 November 2019 в 17:39
поделиться

Это было некоторое время, но это должно работать:

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

В противном случае это должно будет "удвоить расширение" прием:

 #define STR1(x)  #x
 #define STR(x)  STR1(x)
 sscanf(buf, "%" STR(MAX_LEN) "s", val);
7
ответ дан James Curran 24 November 2019 в 17:39
поделиться

Необходимо использовать двойное расширение stringification макро-прием. Или просто имейте

#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);
3
ответ дан Artefact2 24 November 2019 в 17:39
поделиться

В то время как часть вышеупомянутой "работы", лично я рекомендовал бы просто использовать API простой строки вместо dreck, который прибывает в libc. Существует много портативных API, некоторые из которых также оптимизированы для простоты включения в Ваш проект... и некоторым нравится , ustr имеет крошечное пространство наверху и поддержку переменных стека.

1
ответ дан James Antill 24 November 2019 в 17:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: