Строка макроопределения

Я столкнулся с проблемой – мне нужно использовать значение макроса как как строку, так и целое.

#define RECORDS_PER_PAGE 10 /*... */ #define REQUEST_RECORDS \ "SELECT Fields FROM Table WHERE Conditions" \ " OFFSET %d * " #RECORDS_PER_PAGE \ " LIMIT " #RECORDS_PER_PAGE ";" char result_buffer[RECORDS_PER_PAGE][MAX_RECORD_LEN]; /* ...and some more uses of RECORDS_PER_PAGE, elsewhere... */ 

Это выходит из строя с сообщением о «stray #», и даже если это сработает, я предполагаю, что имена макросов будут стробированы, а не значения. Конечно, я могу "LIMIT %d ", page*RECORDS_PER_PAGE значения окончательному методу ( "LIMIT %d ", page*RECORDS_PER_PAGE ), но это не красиво и не эффективно. Пришло время, когда я желаю, чтобы препроцессор не обрабатывал строки особым образом и обрабатывал их содержимое, как обычный код. На данный момент я включил его в #define RECORDS_PER_PAGE_TXT "10" но, по понятным причинам, я не доволен этим.

Как все исправить?

xstr макроса xstr определяемого ниже, будет xstr .

 #define xstr(a) str(a) #define str(a) #a #define RECORDS_PER_PAGE 10 #define REQUEST_RECORDS \ "SELECT Fields FROM Table WHERE Conditions" \ " OFFSET %d * " xstr(RECORDS_PER_PAGE) \ " LIMIT " xstr(RECORDS_PER_PAGE) ";" 
 #include  #define RECORDS_PER_PAGE 10 #define TEXTIFY(A) #A #define _REQUEST_RECORDS(OFFSET, LIMIT) \ "SELECT Fields FROM Table WHERE Conditions" \ " OFFSET %d * " TEXTIFY(OFFSET) \ " LIMIT " TEXTIFY(LIMIT) ";" #define REQUEST_RECORDS _REQUEST_RECORDS(RECORDS_PER_PAGE, RECORDS_PER_PAGE) int main() { printf("%s\n", REQUEST_RECORDS); return 0; } 

Выходы:

 SELECT Fields FROM Table WHERE Conditions OFFSET %d * 10 LIMIT 10; 

Обратите внимание на косвенность на _REQUEST_RECORDS, чтобы оценить аргументы перед их изложением.

Попробуйте удвоить ваши кавычки

 #define RECORDS_PER_PAGE 10 #define MAX_RECORD_LEN 10 /*... */ #define DOUBLEESCAPE(a) #a #define ESCAPEQUOTE(a) DOUBLEESCAPE(a) #define REQUEST_RECORDS \ "SELECT Fields FROM Table WHERE Conditions" \ " OFFSET %d * " ESCAPEQUOTE(RECORDS_PER_PAGE) \ " LIMIT " ESCAPEQUOTE(RECORDS_PER_PAGE) ";" char result_buffer[RECORDS_PER_PAGE][MAX_RECORD_LEN]; int main(){ char * a = REQUEST_RECORDS; } 

компилируется для меня. Маркер RECORDS_PER_PAGE будет расширен макрокомандой ESCAPEQUOTE , который затем отправляется в DOUBLEESCAPE для цитирования.

  • искать текстовый файл с помощью c # и отображать номер строки и полную строку, содержащую ключевое слово поиска
  • Получить версию java из командного файла
  • Получить n-й символ строки в языке программирования Swift
  • Проверьте, соответствует ли строка регулярному выражению в сценарии Bash
  • Есть ли на C # String Tokenizer, например, Java?
  • Найти строку текста в элементе и обернуть вокруг него tags span
  • Создайте переменную java.lang.String
  • Сравнить номера версий без использования функции split
  • Размер файла формата как MB, GB и т. Д.
  • Алгоритм поиска нескольких совпадений строк
  • Как разбить строку, разделенную запятой?
  • Давайте будем гением компьютера.