Почему <signal.h> предотвратить использование «si_» в качестве префикса для имени некоторых переменных?

голоса
24

Я отладки странных ошибок компиляции , что я получаю в моем коде, и я в конечном итоге , узнав, что я не могу использовать префикс si_для некоторых имен переменных (любого типа) , если <signal.h>включен.

Вот очень простой исходный пример кода, который воспроизводит проблему:

#include <signal.h>

int main(void)
{
    int si_value = 0;

    return 0;
}

Если я пытаюсь скомпилировать это с GNU C Compiler gcc, я получаю следующее сообщение об ошибке:

> gcc example.c
In file included from /usr/include/signal.h:57:0,
                 from example.c:2:
example.c: In function ‘main’:
example.c:6:9: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
     int si_value = 0;
         ^
example.c:6:9: error: expected expression before ‘.’ token

Тем не менее, если я использую другое название , например si_value2, ошибка не появляется. В качестве эталона я использую GCC v7.3.0 на Ubuntu Mate 18.04.1 LTS. Та же проблема наблюдается с g++.

Я полагаю , что такое поведение связано с некоторой макроопределения внутри <signal.h>заголовка, но после прохождения через него на короткое время , я не мог найти ничего на самом деле связаны между собой .

Я честно могу это исправить только с помощью другого имени. Тем не менее, мое беспокойство: как я мог элегантно избежать такого вопроса в будущем?


Обновление: Как @FX предложил, используя gcc -E example.cпоказывает , что имя переменной расширяется ( и, следовательно, ошибка):

...
    int 
# 6 example.c 3 4
       _sifields._rt.si_sigval 
# 6 example.c
                = 0;
...
Задан 07/11/2018 в 20:01
источник пользователем
На других языках...                            


2 ответов

голоса
23

<signal.h>фактически не предотвратить использование в si_качестве префикса к переменным. Однако, спецификация POSIX утверждает , что этот префикс зарезервирован для того, чтобы дать заголовок и библиотечные функции , которые он декларирует использовать эти имена, не беспокоясь , что они будут вступать в противоречие с собственными переменными.

Так что здесь происходит, что si_valueопределяется в некотором роде в файле заголовка, возможно , как макрос или ЬурейеЕ, и ваша попытка использовать одни и те же конфликты имен с этим. Если вы использовали si_vy1ghad563nvy43wdэто , вероятно , будет работать, но теоретически заголовок мог бы использовать это имя (думая , что это было бы вряд ли конфликтовать ни с чем программист приложение будет использовать).

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

Ответил 07/11/2018 в 20:20
источник пользователем

голоса
12

как я мог элегантно избежать такого рода проблем в будущем?

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

Ответил 07/11/2018 в 20:06
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more