Вставка макроса на Linux не работает - PullRequest
2 голосов
/ 18 октября 2010

Программа ниже отлично работает на Windows. Но ошибка компиляции происходит на Linux "error: paste". "и" config "не дают действительный токен предварительной обработки"

Любая причина ??? я не могу понять, почему ....

#include <stdio.h>

typedef struct pr {
 int config;
}pr_t;

#define JOIN(x,y) x.##y 

void main()
{

 pr_t temp = {5};

 printf("Value %d\n", JOIN(temp, config)); //temp.config

 return 0;
}

Ответы [ 4 ]

2 голосов
/ 18 октября 2010

Попробуйте без ##:)

#define JOIN(x,y) x.y
1 голос
/ 18 октября 2010

Два токена, которые вместе не образуют действительный токен , не могут быть вставлены вместе с помощью ##.
Ошибка компилятора ясно говорит:

ошибка: вставка "." и "конфиг" делает не указан действительный токен предварительной обработки

Как подсказывают другие, вы можете вообще отказаться от ##.

Подробнее здесь .

1 голос
/ 18 октября 2010

Оператор конкатенации макросов, ##, должен использоваться только между двумя параметрами макроса. Между ними есть точка, которая служит для разделения двух имен параметров. Итак, как предложил ykatchou, просто отредактируйте оператор ## из определения макроса:

#define JOIN(x,y) x.y 

, который все еще должен нормально работать в вашем компиляторе Windows.

0 голосов
/ 18 октября 2010

Это связано с попыткой вставить буквальную строку и токен вместе. Это поведение было изменено в gcc 2.7 и далее, см., Например, информацию здесь: http://weblog.pell.portland.or.us/~orc/2004/12/30/000/index.html

Вы должны быть в состоянии удалить ## и просто объединить операторы:

#define JOIN(x,y) x.y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...