Что означает этот код? #define TO_LITERAL_(текст) #текст

Когда я искал значение __cplusplus, я нашел следующий фрагмент кода.

#include <stdio.h>

int main() {
#define TO_LITERAL(text) TO_LITERAL_(text)
#define TO_LITERAL_(text) #text
#ifndef __cplusplus
/* this translation unit is being treated as a C one */
    printf("a C program\n");
#else
// this translation unit is being treated as a C++ one
    printf("a C++ program\n__cplusplus expands to \""
          TO_LITERAL(__cplusplus) "\"\n");
#endif
    (void)getchar();
    return 0;
}

Этот код дает разные результаты в зависимости от того, каким образом он скомпилирован. Но я плохо разбираюсь в двух жирных линиях.

  1. Почему неправильно, если я объединяю эти две строки в одну строку: #define TO_LITERAL(text) #text
  2. Что означает #текст во второй строке?

Большое спасибо


person LittleSoup    schedule 27.07.2017    source источник
comment
Чтобы увидеть в действии то, что описывает ответ (правильно), вы можете вызвать компилятор с опцией, которая выполняет только препроцессор. Для g++ это -E. Для MSVC это /P.   -  person Scheff's Cat    schedule 27.07.2017
comment
О значении __cplusplus прочитайте это. Этот фрагмент кода показывает, какая стандартная версия C++ действует. У C тоже есть, это __STDC_VERSION__   -  person StoryTeller - Unslander Monica    schedule 27.07.2017