Макросы Variadic: различный вывод для идентичного кода - PullRequest
0 голосов
/ 26 июня 2018

Я создал проект в CLion для тестирования макросов.Я создал макрос для подсчета количества аргументов, данных ему.Во-первых, этот макрос дал мне правильный вывод (0 для без аргументов, 1 для одного аргумента, 2 для двух аргументов ...).Но потом, я не знаю, что случилось, мой макрос просто каким-то образом обесценился.Возможно, это было связано с большим количеством сбоев SIG_ILL, неопределенным поведением, когда я вызывал функцию из ее области объявления, я объявлял функцию внутри выражения.

Я пытался реализовать методы и оператор new, как вC ++, но через препроцессор C, который в конечном итоге был успешным, пока внезапно мой макрос для подсчета аргументов не удался.Теперь он дает 1 без аргументов, 1 для одного аргумента, 2 для двух аргументов.И эта ошибка возникает при компиляции, в то время как функция CLion «текущее текущее использование» показывает, что этот макрос должен расширяться до 0 при вызове без аргументов.

Вот этот проект, просто простой main.c:

#include <stdio.h>

#define Macro_argument_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \
_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, ...) _20

#define Macro_argumentsAmount(ARGS...) \
Macro_argument_20("dummy", ##ARGS, 18, 17, 16, 15, 14, 13, 12, 11,10,\
9, 8, 7, 6, 5, 4, 3, 2, 1, 0)

int main() {
    printf("%i", Macro_argumentsAmount());

    return 0;
}

Я понятия не имел и создал новый проект, чтобы посмотреть, что произойдет, поэтому я скопировал / вставил предыдущий CMakeLists.txt и код и получил ожидаемый вывод.

Так что теперь у меня два идентичныхпроекты, но с другим выходом.Кто-нибудь знает, что не так?

UPD:

Тем не менее при проверке предварительно обработанной версии исходного кода с помощью

gcc -E main.c -std=c17  -fplan9-extensions  -Werror -Wno-implicit - 
Wno-error=variadic-macros -Wno-error=implicit-fallthrough

Я вижу следующее основное в обоих проектах (хотя один изих печатает 0):

# 9 "main.c"
int main() {
 printf("%i", 1);

 return 0;
}

1 Ответ

0 голосов
/ 26 июня 2018

Когда вы добавляете параметр -std=c17 в компилятор, вы отключаете расширение проглатывания GCC для ##ARGS.

. Вместо этого используйте -std=gnu17, чтобы включить расширения GNU вместе с функциями c2017.

...