2017-01-21 2 views
0
static int* p= (int*)(&foo); 

Я просто знаю p указывает на память в сегменте кода. Но я не знаю, что именно происходит в этой строке.
я подумал, что это указатель на функцию, но формат, чтобы указать функцию является:Что означает эта линия в C99?

returnType (*pointerName) (params,...); 
pointerName = &someFunc; // or pointerName=someFunc; 

ответ

1

Берешь адрес foo и приведение его в указатель на int.

Если foo и p имеют разные типы, компилятор может выдавать предупреждение о несоответствии типов. Бросок должен подавить это предупреждение.

Например, рассмотрим следующий код, который вызывает предупреждение компилятора (initialization from incompatible pointer type):

float foo = 42; 
int *p = &foo; 

Здесь foo является float, а p точек на int. Ясно - разные типы.

Приведение типов делает компилятор обработанной одной переменной, как если бы она была другого типа. Вы создаете, помещая новое имя типа в скобки. Здесь мы будем делать указатель float, чтобы рассматриваться как указатель на int и предупреждение не будет больше:

float foo = 5; 
int *p = (int*)(&foo); 

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

float foo = 5; 
int *p = (int*)&foo; 

Вопрос такой же, если foo является функцией. У нас есть указатель на функцию с правой стороны присваивания и указатель на int с левой стороны. Листинг будет добавлен, чтобы указатель на функцию обрабатывался как адрес int.

+0

По типу функции вы имеете в виду тип возвращаемой переменной? – TheLogicGuy

+0

Нет никаких функций! Я расширил свой ответ, так что теперь, наверное, это яснее. – lukeg

+0

Но считать 'foo' функцией не переменную. Как это возможно сейчас? – TheLogicGuy

0

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

Кроме того, стандарт позволяет составителям интерпретировать код, который бросает указателей в бессмысленных модах, если код Помощников некоторых ограничениями , которые, как написано сделать такие броски по существу бесполезны, для номинального целью содействия оптимизации. Когда правила были написаны, большинство компиляторов , вероятно, выполнили бы примерно половину оптимизаций, которые могли бы быть разрешены по правилам, но все равно обработали бы стрелки указателей , так как это обойдется примерно в 5% от теоретически возможных оптимизаций. Однако сегодня для разработчиков компилятора более модно искать все случаи, когда оптимизация может быть разрешена стандартом без учета того, имеют ли они смысл.

Составителей как НКУ имеет возможность -fno-строгое сглаживание, который блокирует этот разновидности оптимизации, как в тех случаях, когда он будет предлагать большие преимущества и небольшого риска, а также в тех случаях, когда это будет почти наверняка сломать и вряд ли предложит какую-либо реальную выгоду. Было бы полезно, если бы у была возможность заблокировать только последнее, но я не знаю об этом. Таким образом, моя рекомендация заключается в том, что если вы не хотите программировать в очень ограниченном подмножестве языка Денниса Ричи, я бы предложил настроить таргетинг на диалоги -fno-strict-aliasing .

Смежные вопросы