LINUX.ORG.RU

Препроцессор си


0

0

Должен ли работать такой код?

#define SUMM(A,B) (A)+(B)
#define COMMA ,

int x=SUMM(3 COMMA 4);

При компиляции оно говорит, что макросу SUMM вместо двух параметров передают один.

При этом строка

int x[]={1 COMMA 2 COMMA 3};

обрабатывается нормально.

Как я понял, дело во вложенности директив. Можно ли это заставить работать?

PS. Извращение, конечно, то еще, но сильно хочется. И именно на си/c++.

anonymous

Судя по всему, даже если бы удалось заставить это работать, оно заменилось бы на что-то вроде

(3, 4) + (B)

Legioner ★★★★★
()

% cat main.c                                                /home/legioner/test
#include <stdio.h>

#define SUM(A, B) ((A) + (B))
#define COMMA ,

int main(void)
{
        int s = SUM(3 COMMA 4, 5);
        printf("%d\n", s);
        return 0;
}
% gcc main.c -o test                                        /home/legioner/test
% ./test                                                    /home/legioner/test
9


Т.е. в данном случае действительно заменяется на
(3, 4) + 5
что, естественно вычисляется как 9.

Legioner ★★★★★
()
Ответ на: комментарий от anonymous

Все, разобрался.
Это работает:

#define _SUM(A) SUM(A)
#define SUM(A, B) ((A) + (B))
#define COMMA ,

int s = SUM(3 COMMA 4);

Преобразуется в 

int s = (3) + (4);

anonymous
()
Ответ на: комментарий от dilmah

Там опечатка. Должно быть так:

#define _SUM(A) SUM(A)
#define SUM(A, B) ((A) + (B))
#define COMMA ,

int s = _SUM(3 COMMA 4);

То есть сначала - как один аргумент, затем - как два.

Это по стандарту будет? 

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.