Имена функций не будут искажены, за исключением, по-видимому, идентификаторов Unicode. Например:
// Mangled as "o_u03ba" using Intel's compiler "icc").
extern int o\u03ba(void);
Проблема с icc
, выделенная в статье блога, связанной с вопросом, очевидно, является проблемой, когда компилятор генерирует неуникальные имена символов:
//Both will have the same symbol name.
extern void o\u03ba(volatile int *p)
{
*p = -32767;
}
extern void o_u03ba(volatile int *p)
{
*p = 0;
}
...
volatile int n;
// Should print -32767; may print 0 or -32767.
o\u03ba(&n);
printf("%d\n", n);
// Should print 0; will print the same thing as the previous line.
o_u03ba(&n);
printf("%d\n", n);
Функции, объявленные с помощью ключевого слова static
, имеют внутреннюю связь. Несмотря на это, внутреннее представление компилятора может по-прежнему использовать искаженное имя, хотя вы никогда не увидите его в результирующей программе. Однако при разрешении ссылок на функции код, представленный в статье, указывает на то, что даже использование имени вообще может вызвать проблему:
static void foo\u03ba(volatile int n)
{
printf("foo\\u03ba: n = %d\n", n);
}
static void foo_u03ba(volatile int n)
{
printf("foo_u03ba: n = %d\n", n);
}
...
volatile int n = 10;
// These two lines may print the same thing.
foo\u03ba(n);
foo_u03ba(n);
Поскольку технически вы не можете взять адрес функции и надежно его распечатать, лучшее, что вы можете сделать, — это однозначно определить, какая функция вызывается.
person
Community
schedule
06.06.2015