2013-12-02 12 views
3

Я начинаю изучать C++. Вот это проблема, которая у меня есть:Недопустимое косвенное обращение при умножении

#include <iostream> 
using namespace std; 
#define PI 3.14; 

int main(){ 
    double r = 5.0; 
    double circle; 
    double inp; 

    circle = 2 * PI * r; 
    cout << circle; 
    cin >> inp; 
} 

Это показывает ошибку: error C2100: illegal indirection. Я искал Google, но не нашел ответа. Thanks

+5

Лучшая политика заключается в том, чтобы прекратить использование #define –

+0

@DavidHeffernan спасибо, я следую учебникам .. – karaxuna

+1

Сделать целью, чтобы избежать #define, если возможно по-человечески. Эта политика послужит вам хорошо. –

ответ

11
#define PI 3.14; 

; не соответствует действительности, удалите его.

btw, ваша линия расширяется до circle = 2 * 3.14; * r; Таким образом, компилятор тогда жалуется на * r, что объясняет сообщение об ошибке.

+0

Спасибо большое :) – karaxuna

+8

Лучше еще, измените его на 'const double PI = 3.14;'. Ненужные макросы - плохая идея, даже если вам удастся избежать всех синтаксических deathtraps. –

+0

@MikeSeymour спасибо, я буду считать, что – karaxuna

6

Макросы (относительно) простые замены так, когда вы пишете:

#define PI 3.14; 
circle = 2 * PI * r; 

это фактически заканчивается как:

circle = 2 * 3.14; * r; 

эффективно два заявления:

circle = 2 * 3.14; 
* r; 

Эта последняя строка будет вполне корректным выражением (alb это не очень полезно), если r были указателем некоторого описания. Однако, учитывая, что это двойной, именно там вы получаете незаконную косвенность.

Использование макросов - это то, что вы обычно должны избегать в наши дни, за исключением особых обстоятельств. Использование их для предоставления встроенных функций было в основном связано с ключевым словом inline («в основном», потому что ключевое слово inline - это всего лишь предложение).

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

Другими словами, ваша постоянная PI будет лучше записать как что-то вроде:

const double PI = 3.141592653589; 

Просто о единственном месте, я использую предварительно процессор в настоящее время является для условной компиляции.


Как и в сторону, вы, вероятно, имел в виду, а не circumferencecircle. Первая - это длина вокруг внешней окружности, последняя на самом деле не является значением длины.

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