Что означает ## для препроцессора C (C ++)?

У меня есть программа C ниже:

#define f(g,g2) g##g2 main() { int var12=100; printf("%d",f(var,12)); } 

когда я запускаю только препроцессор, он расширяет это как

 { int var12=100; printf("%d",var12); } 

поэтому причиной является 100.

Может ли кто-нибудь сказать мне, как / почему препроцессор расширяет var##12 to var12 ?

    ничего необычного: ## сообщает препроцессору объединить левую и правую стороны

    см. http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenation

    потому что ## – оператор коннек-ции маркера для препроцессора c.

    Или, может быть, я не понимаю вопроса.

    ## – Оператор вставки в токен

    Оператор double-number-sign или «token-pasting» (##), который иногда называют оператором «слияния», используется как в объектно-подобном, так и в функциональном макросе. Это позволяет отдельным токенам объединяться в один токен и, следовательно, не может быть первым или последним токеном в определении макроса.

    Если формальному параметру в определении макроса предшествует или следует оператор маркера, формальный параметр немедленно заменяется нерасширенным фактическим аргументом. Расширение макроса не выполняется по аргументу перед заменой.

    #define f(g,g2) g##g2

    ## используется для конкатенации двух макросов в c-препроцессоре. Поэтому перед компиляцией f (var, 12) следует заменить препроцессором var12, и, следовательно, вы получили результат.

    Interesting Posts

    Запись в ZipArchive с использованием HttpContext OutputStream

    Защита данных на жестком диске: поиск подходящих технологий

    динамическая строка с использованием String.xml?

    Что на самом деле происходит в try {return x; } наконец {x = null; } заявление?

    Как найти временную сложность алгоритма

    Обновление для Windows 10 Anniversary завершается неудачно

    Что делать, если мой USB-накопитель защищен от записи или доступен только для чтения?

    Сильно типизированный ASP.NET MVC с ADO.NET Entity Framework

    Что удерживает мой компьютер от сна?

    Аутентификация Windows и добавление полномочий авторизации через базу данных – MVC asp.net

    cout или printf, какая из двух имеет более быструю скорость выполнения C ++?

    Ошибка: значение null в записи: incrementalFolder = null

    Как подождать, когда BackgroundWorker отменит?

    После обновления до Google Play Services 9.0.0 приложение зависает в DynamiteModulesC

    Как удалить строки предварительного просмотра печати в Excel 2010?

    Давайте будем гением компьютера.