2015-10-07 7 views
2

В частности, мой вопрос, учитывая этот макрос:Будет ли листок когда-либо терпеть неудачу в C?

#define FAKE_VAL(type) ((type)0) 

... есть какое-то значение type (включая структуры, указатели на функции и т.д.), где FAKE_VAL(type) вызовет ошибку во время компиляции?

Я спрашиваю, потому что у меня есть макрос, который принимает указатель на функцию в качестве аргумента и должен найти размер возвращаемого значения. Я знаю, тип и количество аргументов указатель функции принимает, поэтому я планирую написать что-то вроде:

sizeof(fptr(FAKE_VAL(arg_type_1), FAKE_VAL(arg_type_2))) 

arg_type_1 и 2 может быть в буквальном смысле ничего.

+1

Я полагаю, что мы исключаем такие значения, как ';;;' или '2' для' type', правильно? – user2357112

+0

@ uaer2327112: yep – Functino

ответ

2

Вы не можете бросить Int к типу массива, так

FAKE_VAL(int[5]); 

потерпит неудачу. Try it!

3

Конечно, есть.

struct fred (т. Е. Не указатель) - как вы преобразовываете 0 (скалярный тип) в структуру (не скалярный тип)? Любое буквальное значение FAKE_VAL("hi") дает (("hi")0) - что это значит?

+0

В данном конкретном случае аргумент FAKE_VAL считается типом. См. Комментарий пользователя2327112. – Functino

+0

'struct fred' - это тип. Возможно, вы имеете в виду скалярный тип? – John3136

+0

@ John3136: '' hi "' не является типом, поэтому ваш другой пример не работает. 'struct fred' соответствует условиям и ломает приведение, тем не менее, особенно если' struct fred' является неполным типом. – user2357112

-1

Привод типа используется для информирования компилятора о том, что программист уже рассмотрел побочные эффекты использования переменной по-другому, чем это было объявлено. Это заставляет компилятор отключать свои проверки. Таким образом, с помощью типов вы не получите предупреждений/ошибок.
Да. он вводит преобразование любого типа в typecasted. Виноват. Но это может привести к ошибкам сегментации/ошибкам при запуске программы.

+0

Несомненно, он делает больше, чем «отключает проверки типов». – user2864740

+0

@ user2864740 '2 == (int) 2.7;' - Несомненно. – Functino

0

Чтобы дать ему более систематический ответ. В C cast допускается только для арифметических и указательных типов. Итак, все, что есть struct, union или тип массива, приведет к ошибке времени компиляции.

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