Почему это компилируется в C, а не в C ++ (sigaction) - PullRequest
3 голосов
/ 20 апреля 2009

Я получаю следующие ошибки при попытке скомпилировать приведенный ниже код, используя g ++. Когда я компилирую его с помощью gcc, он работает нормально (кроме нескольких предупреждений). Любая помощь приветствуется.

g++ ush7.cpp
ush7.cpp: In function ‘int signalsetup(sigaction*, sigset_t*, void (*)(int))’:
ush7.cpp:93: error: expected unqualified-id before ‘catch’
ush7.cpp:95: error: expected primary-expression before ‘catch’
ush7.cpp:95: error: expected `;' before ‘catch’
ush7.cpp:97: error: expected primary-expression before ‘catch’
ush7.cpp:97: error: expected `;' before ‘catch’
ush7.cpp:100: error: expected primary-expression before ‘catch’
ush7.cpp:100: error: expected `)' before ‘catch’
ush7.cpp:108: error: expected `)' before ‘;’ token
ush7.cpp:108: error: expected `)' before ‘;’ token
ush7.cpp: In function ‘int makeargv(const char*, const char*, char***)’:
ush7.cpp:137: error: invalid conversion from ‘void*’ to ‘char*’
ush7.cpp:145: error: invalid conversion from ‘void*’ to ‘char**’

int signalsetup(struct sigaction *def, sigset_t *mask, void (*handler)(int))
{
   struct sigaction catch;

   catch.sa_handler = handler;  /* Set up signal structures  */
   def->sa_handler = SIG_DFL;
   catch.sa_flags = 0;
   def->sa_flags = 0;
   if ((sigemptyset(&(def->sa_mask)) == -1) ||
       (sigemptyset(&(catch.sa_mask)) == -1) ||
       (sigaddset(&(catch.sa_mask), SIGINT) == -1) ||
       (sigaddset(&(catch.sa_mask), SIGQUIT) == -1) ||
       (sigaction(SIGINT, &catch, NULL) == -1) ||
       (sigaction(SIGQUIT, &catch, NULL) == -1) ||
       (sigemptyset(mask) == -1) ||
       (sigaddset(mask, SIGINT) == -1) ||
       (sigaddset(mask, SIGQUIT) == -1))
       return -1;
    return 0;
}

Ответы [ 2 ]

16 голосов
/ 20 апреля 2009

catch - это ключевое слово в C ++, но не в C.

Пожалуйста, смотрите мой связанный ответ C не является правильным подмножеством C ++ здесь , или даже лучше здесь .

0 голосов
/ 20 апреля 2009

Вы должны иметь возможность использовать #define, если не хотите изменять остальную часть кода.

#define catch _catch
...