Почему предпроцессор интерпретирует слово “linux” как постоянная величина “1”?

Первоначальный вопрос: Why does the C preprocessor interpret the word “linux” эксперт the constant “1”? ahmedaly50

Почему предпроцессор в GCC интерпретирует слово linux как постоянная величина 1?

test.c

#include 
int main(void)
{
int linux = 5;
return 0;
}

Результат $ gcc -E test.c (для после этапа пред-процессора):

int main(void)
{
int 1 = 5;
return 0;
}

То, что, конечно, производит ошибку.

(Конечно: Нет одного #define linux в файле stdio.h)

14
задан 23.05.2017, 15:39
1 ответ

Компиляция программ в C и C ++ он не предполагает простой этап, а именно, исходный код принимается как ввод и выполнимый выражается как вывод. В действительности, составитель одинокий предмет (хотя главный предмет) процесса, который начинается с предпроцессором, он остается с составителем в себе, и покончи с редактором связей (linker). В эту цепь программ часто вызов, краткой формы, toolchain, так как это точно цепь программных средств, которая взрывается, чтобы в конце концов производить выполнимую программу. Это, конечно, философия работы в UNIX, так что маленькие программные средства решают относительно простые проблемы, и Ваше связывание заканчивает тем, что производит результат, который может быть таким сложным как выполнимая программа. Внутри этой цепи, предпроцессора CPP, определи серию макросов, которые доступны не составлять перед тем, как ничего. Говорится о так называемых предопределенных макросах.

Эти макросы помогают в процессе компиляции (например, __FILE__ всегда принеси имя файла, который они составляют), они помогают другим знать, какова цель компиляции (__STDC__ стой один, если составлен C стандарт).

Со временем, эти макросы повернулись такие популярные, что весь мир использовал их, и следовательно были стандартизированы. Так, есть предопределенные макросы, которые например у каждого toolchain для C должны быть. В течение процесса стандартизации, он подошел близко в заключение, что лучшее состоит в том, чтобы эти макросы предшествовались, также как и были продолжены, подчеркнутой двойной порции. Например, макрос linux он перешел к тому, чтобы быть __linux__. Таким образом, пользователь никогда не выбрал бы из-за ошибки имя предопределенного макроса, что привело бы в проблемы как тот, которого ты описываешь.

Макрос linux, также как и unixон использовался как помощь для того, чтобы знать, зачем система была составлена. Со временем, они перешли к тому, чтобы быть преобразованными согласно тому, что показывало стандарт, но они упорствуют в назначенной по умолчанию компиляции, чтобы служить в те старые программы, которые все еще обладают присутствием этих макросов, для того, чтобы быть составленными правильно.

Чтобы знать предопределенные макросы, оно можешь призывать cpp, (К Пре-Просессор, предпроцессор C, ничто, что можно видеть с C ++) с выборами -dM (важно уважать прописные буквы и строчные буквы) для того, чтобы он занес в список тебе все назначенные по умолчанию макросы. Поскольку ты не захочешь внести файл, ты можешь делать это с /dev/null.

$ cpp -dM /dev/null
#define __unix__ 1
#define __linux__ 1
#define unix 1
#define linux 1
#define __x86_64 1
...

Между многими другими, в моей машине (Ubuntu 15.10 x64) определены макросы, которые это идентифицируют как linux, как вариант (стандарт POSIX) unix, и как архитектура 64 бит. Так...

$ cpp -dM /dev/null | grep linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1

С grep мы можем выдавать результат для того, чтобы они появились единственный и исключительно макросы, которые считают идентификатором или частью Вашего идентификатора слово linux. Мы видим, что все, они старые и новости.

Что происходит, если мы показываем CPP, что мы хотим составить для стандарта C, как например стандарт 1999?

$ cpp -dM /dev/null -std=c99 | grep linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1

Поскольку мы просили его CPP, который был бы более строгим, только появляются предопределенные макросы, которые действительно составляют часть стандарта.

Предопределенные макросы стандарт, также как и предопределенные макросы, свойственные CPP документировались в учебнике предпроцессора.

Я надеюсь, что это отвечает на твой вопрос.

20
ответ дан 01.12.2019, 08:13
  • 1
    Он знал более или менее, что шла история, но ни из-за мелькания стольких деталей, очень интересными являются те, которые ты вносишь в твоем ответе спасибо за нее Привет – Angel Angel 22.12.2015, 18:52