Я создал проект в 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;
}