Что именно вы хотите получить? Вам нужно объяснить, что, по вашему мнению, вы можете получить в качестве выходного сигнала препроцессора C.
У вас проблемы с областью действия и попытка определить макрос внутри текста замены другого макроса.
Область
Макрос make_def()
вызывает неопределенную функцию 'func_call'. Функция createstuff()
использует неопределенную переменную mydata
. И функция dostuff()
, кажется, вызывает неопределенную функцию somefunc_call()
с перечислением, которое, возможно, могло бы быть определено внутри отдельной функции.
Если перечисление определено внутри одной функции, это перечисление недоступно для кода вне этой функции и, в частности, недоступно ни для вызываемых функций, ни для вызывающих функций. Это само по себе ограничивает полезность того, что вы пытаетесь сделать. (Да, значения перечисления могут быть неявно преобразованы в int
или некоторый подобный тип, но в действительности это не тот тип перечисления, который используется.)
Определение макросов в макросах
Вы не можете создать макрос, который сам содержит #define
или любую другую директиву препроцессора в тексте замены.
Если вызывается внешний макрос, расширение не интерпретирует внутреннее #define
как директиву препроцессора, поэтому оно почти всегда заканчивается как ошибка. В контексте #
должен быть оператором stringize, а слово 'define' после этого должно быть именем аргумента внешнего макроса, чтобы иметь возможность работать.
// Does not work as intended
#define macro(define, prefix) #define another(name) foo(prefix ## name)
macro(something, other);
Формирует:
"something" another(name) foo(othername);
_Pragma
в C99 является частичным исключением из того, что «расширение макроса не может содержать директиву препроцессора», но оно (_Pragma
) не начинается с #
.