The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"макрос для конкатенации строк"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"макрос для конкатенации строк"  
Сообщение от roman (??) on 17-Ноя-08, 04:51 
Всем привет,

мне нужно генерировать строковые литералы из 2-х составляющих для дальнейшего использования их в printf, или puts. Наваял вот такой макрос, склеивающий строки:

#define PASTE(a, b)   a##b

puts(PASTE("abc", "def"));

Вываливается с ошибкой:

error: pasting ""abc"" and ""def"" does not give a valid preprocessing token

Почему не воспринимаются эти токены, что не нравится препроцессору? Вообще может быть есть какой-то более правильный способ для моей задачи?

PS. Если макрос переделать вот так:

#define PASTE(a, b)     #a#b

то все компилируется отлично, но строка выводится в таком виде, что и понятно:

"abc""def"

Мне бы хотелось так:

abcdef

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "макрос для конкатенации строк"  
Сообщение от Andrey Mitrofanov on 17-Ноя-08, 11:37 
>может быть есть какой-то более правильный способ для моей задачи?

Всё может быть. Напимер, генерировать файл с нужными тебе строками из исходного вида (не обязательно Си) - в "готорый" Си "механически", но другим "препроцессором". Шел, сед, оук, перл, руби, питон и т.д.

>Мне бы хотелось так:
>
>abcdef

В те далёкие %)) времена, когда я писал на Си, строки-константы и так "клеились", вроде -

puts(\
"Usage: superpuper <args>...\n\n"\
"  args - any number of file names or options");

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "макрос для конкатенации строк"  
Сообщение от jd2 (??) on 17-Ноя-08, 19:32 
Помедитируйте над следующим кодом и над тем, что выдаёт эта программа.

#include <stdio.h>

#define A(a, b) a##b
#define B(a, b) (a b)

int main()
{ char *abcd = "hello";

  printf("%s\n", A(ab, cd));
  printf("%s\n", B("ab", "cd"));

  return 0;
}


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "макрос для конкатенации строк"  
Сообщение от cruz on 18-Ноя-08, 04:29 
>Помедитируйте над следующим кодом и над тем, что выдаёт эта программа.
>
 
>#include <stdio.h>
>
>#define A(a, b) a##b
>#define B(a, b) (a b)
>

Чтобы gcc с максимально поднятым уровнем ворнингов был счастлив, лучше сделать так:

int main(void)
{
  const char *abcd = "hello";
  ...
}

>int main()
>{ char *abcd = "hello";
>
>  printf("%s\n", A(ab, cd));
>  printf("%s\n", B("ab", "cd"));
>
>  return 0;
>}
>

Типичный набор параметров компилятора, который я применяю ежедневно:

-ansi -pedantic -W -Wall -Wformat-nonliteral -Wcast-align -Wpointer-arith -Wbad-function-cast -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations  -Winline -Wundef -Wnested-externs -Wcast-qual -Wshadow -Wconversion -Wwrite-strings -ffloat-store -fno-common -O0

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру