Аргумент token-string складається з ряду токенов, наприклад ключових слів, констант або повних операторів. Аргумент token-string повинен бути відділений від аргументу identifier одним або декількома символами пробілу. Ці пропуски не вважаються частиною заміненого тексту, як і всі інші прогалини, які йдуть за останнім токеном тексту.
Директива #define без аргументу token-string видаляє входження identifier з вихідного файлу. Ідентифікатор, заданий аргументом identifier. залишається певним і може бути перевірений за допомогою директив #if defined і #ifdef.
Друга форма синтаксису визначає макрос, подібний функції, з параметрами. Ця форма допускає використання необов'язкового списку параметрів, які повинні знаходитися в дужках. Після визначення макросу кожне наступне входження identifier (identifier необ. Identifier необ) замінюється версією аргументу token-string. в якій замість формальних параметрів підставлені фактичні аргументи.
Імена формальних параметрів відображаються в token-string. щоб позначити розташування, куди підставляються фактичні значення. Ім'я кожного параметра може використовуватися в token-string кілька разів, і імена можуть розміщуватися в будь-якому порядку. Число аргументів у виклику повинно відповідати числу параметрів у визначенні макросу. Належне використання дужок забезпечить правильну обробку складних фактичних аргументів.
Формальні параметри в списку розділяються комами. Всі імена в списку повинні бути унікальними, і список повинен бути укладений в дужки. Між відкриває дужкою і identifier не повинно бути пробілів. Для довгих директив, розташованих в декількох рядках вихідного коду, використовуйте об'єднання рядків: безпосередньо перед символом нового рядка розмістіть зворотну косу риску (\). Область імені формального параметра розширюється до нового рядка, завершальній token-string.
Якщо макрос визначений у другій формі синтаксису, наступні текстові екземпляри, за якими знаходиться список аргументів, вказують на виклик макросу. Фактичні аргументи, які йдуть за примірником identifier в вихідному файлі, зіставляються з відповідними формальними параметрами у визначенні макросу. Кожен формальний параметр в рядку token-string. якому не передує оператор створення рядка (#), створення символу (# @) або вставки токена (##) або за яким не слід оператор ##. замінюється відповідним фактичним аргументом. Перед заміною директивою формального параметра все макроси у фактичному аргументі розгортаються. (Оператори описані в розділі Оператори препроцесора.)
У наступних прикладах макросів з аргументами показана друга форма синтаксису #define: