Всем привет,мне нужно генерировать строковые литералы из 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
>может быть есть какой-то более правильный способ для моей задачи?Всё может быть. Напимер, генерировать файл с нужными тебе строками из исходного вида (не обязательно Си) - в "готорый" Си "механически", но другим "препроцессором". Шел, сед, оук, перл, руби, питон и т.д.
>Мне бы хотелось так:
>
>abcdefВ те далёкие %)) времена, когда я писал на Си, строки-константы и так "клеились", вроде -
puts(\
"Usage: superpuper <args>...\n\n"\
" args - any number of file names or options");
Помедитируйте над следующим кодом и над тем, что выдаёт эта программа.
#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;
}
>Помедитируйте над следующим кодом и над тем, что выдаёт эта программа.
>
>#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