«Устаревшая» нотация для компилятора Sun C ++? - PullRequest
3 голосов
/ 21 мая 2009

Имеет ли компилятор Sun нотацию, чтобы помечать функции как устаревшие, например, GCC __attribute__ ((deprecated)) или MSVC __declspec(deprecated)?

Ответы [ 2 ]

2 голосов
/ 02 июня 2009

Похоже, что одно решение, которое будет работать на любом компиляторе, поддерживающем #warning, будет:

  • Скопируйте соответствующий заголовок в новое, продвинутое имя заголовка
  • Удалить устаревшие функции из продвинутого заголовочного файла
  • Добавить в старый заголовочный файл: #warning "This header is deprecated. Please use {new header name}"
1 голос
/ 21 мая 2009

Это даст вам предупреждение компилятора о солнце с флагом "+ w" или о gcc с флагом "-Wall". К сожалению, это нарушает совместимость ABI функции; Я еще не нашел способ обойти это.

#define DEPRECATED char=function_is_deprecated()

inline char function_is_deprecated()
{
    return 65535;
}

void foo(int x, DEPRECATED)
{
}

int main()
{
    foo(3);
    return 0;
}

Выход:

CC -o test test.cpp +w
"test.cpp", line 7: Warning: Conversion of "int" value to "char" causes truncation.
"test.cpp", line 15:     Where: While instantiating "function_is_deprecated()".
"test.cpp", line 15:     Where: Instantiated from non-template code.
1 Warning(s) detected.

То, как вы используете это, когда вы хотите объявить функцию устаревшей, вы добавляете запятую в конец списка параметров и пишете DEPRECATED. Он работает под капотом, добавляя аргумент по умолчанию (таким образом сохраняя API), который вызывает предупреждение о преобразовании.

...