2013-06-04 2 views
1

Я хотел бы определить значение с помощью типа float; точнее, с функцией squareroot.
Он должен выглядеть примерно так: #define hyp sqrt(pow(50,2) + pow(50,2)).
Но для этого значения он кажется не постоянным, поэтому у меня есть некоторые предупреждения и конфликты типов.
По какой причине он не постоянен?
Является ли число с плавающей точкой, всегда генерируемым во время выполнения, и все целые числа при компиляции?
Или это противоречиво, потому что объявление sqrt должно находиться внутри некоторой области функции?Элемент инициализации не является константой (функция sqrt)

[править] Чтобы быть более ясным: Этих предупреждений обусловлены какой-либо операция с определенным значением квадратного корня-#define P + hyp - и что я получаю предупреждение. И P затем помещается в массив, double arr_ps[] = {P,...}. Там нет никаких проблем с целыми числами, только с этой sqrt- значение [/ править]

@Simon
У меня есть файл заголовка points.h:.

#define x    10 
#define y    10 
#define distance 100 
#define P1x   x 
#define P1y   y 
#define hyp   sqrt(pow(50,2) + pow(50,2)) 
#define P1x_new P1x + distance 
#define P1y_new P1y + hyp 

Тогда у меня есть файл Си:

#include "points.h" 

double arr_x[2]={P1x,P1x_new}; 
double arr_y[2]={P1y,P1y_new}; 

main(){ 

    printf("Px: %f, Py: %f \n",arr_x[0],arr_y[0]); 
    printf("Px_new: %f, Py_new: %f \n", arr_x[1],arr_y[1]); 

} 

Предупреждение: initializer element is not constant (near initialization for 'arr_y') - и я получаю три из них.

+0

Почему вы даже используете препроцессор для этого? Вероятно, это просто постоянная или встроенная функция. –

+0

Можете ли вы показать, как вы используете 'hyp' в другом месте вашего кода? –

+0

Можете ли вы показать краткий, самодостаточный пример кода? Я попытался воспроизвести вашу проблему и не мог этого сделать. Я попробовал пару разных способов и не получил никаких предупреждений о том, что вы описали из 'gcc'. – Simon

ответ

5

пункт 6.6, пункт 3 стандарта говорит

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

что постоянное выражение не должно содержать вычисляемый вызов функции.

Это потому, что

Постоянное выражение может быть оценено в процессе перевода, а не выполнение, и, соответственно, может быть использован в любом месте, что константа может быть.

(параграф 2 ibid), а вызов функции может быть невозможно оценить во время перевода.

В константном выражении - и такой необходимы, чтобы инициализировать объекты статической продолжительности хранения - вы можете использовать только основные арифметические операции, +-*/ и sizeof (но только если результат является целым числом константы) и _Alignof:

арифметический константа должна иметь арифметический тип и должен иметь только операнды, которые являются целыми константами, плавающие константы, константы перечисления, константы, символьные sizeof выражения, результаты которых являются целыми константами, и _Alignof выражения. Операторы Cast в выражении с постоянной арифметикой должны преобразовывать только арифметические типы в арифметические типы, за исключением частичного операнда оператора sizeof или _Alignof.

Термин «постоянное выражение» имеет технический смысл, который намного уже, чем повседневный смысл.

+0

Тогда что такое плавающая константа в gcc? Что-то вроде Пи? И более того, как определить плавающие константы? –

+0

Вы определяете константу с плавающей запятой, присваивая ей число, а не результат вызова функции: 'const float x = 1.0f;' В вашем случае вы должны предварительно вычислить свое уравнение и вставить значение. –

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