"Устаревшая" нотация для компилятора Sun C++?
Есть ли у компилятора Sun нотация, чтобы помечать функции как устаревшие, как в GCC __attribute__ ((deprecated))
или MSVC __declspec(deprecated)
?
2 ответа
Решение
Кажется, что одно решение, которое будет работать на любом компиляторе, который поддерживает #warning
было бы:
- Скопируйте рассматриваемый заголовок в новое продвигаемое имя заголовка.
- Удалите устаревшие функции из продвигаемого заголовочного файла.
- Добавьте в старый заголовочный файл:
#warning "This header is deprecated. Please use {new header name}"
Вы получите предупреждение компилятора о солнце с флагом "+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), который вызывает предупреждение о преобразовании.