Язык программирования C++, упражнение "Определения против деклараций" (простой, если утомительная помощь нужна XD)

Я работал над "Языком программирования C++" Бьярна Страуструпа (2-е издание - я знаю, что я действительно должен получить новую копию, но это книга для библиотеки!), И у меня было несколько вопросов по одному из его более простых вопросов. В главе 2, говоря о объявлениях и константах, он перечисляет набор объявлений, некоторые из которых также являются определениями. В упражнении в конце главы он предлагает читателю вернуться назад и переписать список, на этот раз изменив все определенные объявления на простые объявления и изменив все не определенные объявления на определение.

Я выполнил это задание, надеюсь, в основном правильно, но было несколько частей, на которых я застрял. Я был бы признателен, если бы кто-нибудь мог быстро просмотреть мой список, проверить, есть ли какой-либо из первоначального списка, который я неправильно распределил, а затем проверить мои изменения - в том числе наиболее конкретно, как объявить, но не определить typedefи если мой enum объявление-не-определение является правильным. Большое спасибо всем, кто помогает. Я прошу прощения, так как это не строго прямой вопрос кода - то есть здесь нет компилируемого кода, это больше... Я не знаю. Но в нем есть код, так что я надеюсь, что все в порядке.

// Original:

/*

char ch;                                                    // Definition.
int count = 1;                                              // Definition.
char* name = "Njal";                                        // Definition.
struct complex { float re, im; };                           // Definition.
complex cvar;                                               // Definition.
extern complex sqrt(complex);                               // Declaration, NOT definition.
extern int error_number;                                    // Declaration, NOT definition.
typedef complex point;                                      // Definition.
float real(complex* p) { return p->re; }                    // Definition.
const double pi = 3.1415926535897932385;                    // Definition.
struct user;                                                // Declaration, NOT definition.
template<class T> abs(T a) { return a < 0 ? -a : a; }       // Definition.
enum beer { Carlsberg, Tuborg, Thor };                      // Definition.

*/

// Definitions/Declarations switched:

/*
extern char ch;
extern int count;
extern char* name;
struct complex;
extern complex cvar;
complex sqrt(complex in) {                                  // Yes, my maths may be wrong here. Doing the actual maths from memory.
    complex out;
    out.re = (in.re * in.re) - (in.im * in.im);
    out.im = (in.re * in.im)*2;
    return out;
}
int error_number;
                                                            // No idea how to declare but not define a typedef!
float real(complex* p);
extern const double pi;
struct user { string name; int age; char gender; };         // Lets assume we include <string>, and yes, using int for age *might* be a bit wasteful, but meh.
template<class T> abs(T a);
extern enum beer;                                           // Not sure if this is right.

*/

1 ответ

Решение

typedef complex point; это не определение в C++, а только в C.

Вы также не можете, насколько я знаю, предоставить неопределяющую декларацию для pi без изменения его значения, потому что определение, которое он показывает, имеет внутреннюю связь, но если вы положите extern const double pi; вы дадите ему внешнюю связь (возможно, конфликтующую с другими единицами перевода) pi имена). Обратите внимание, что правила сцепления сложны

static int a;
extern int a; // valid, 'a' still internal

extern int b;
static int b; // invalid!

const double pi1 = 3.14;
extern const double pi1; // valid, and 'pi1' is internal

extern const double pi2;
const double pi2 = 3.14; // valid, but 'pi2' is now external

Вы также не можете только объявить перечисление без его определения.

Я считаю, что другие ваши решения верны.

Другие вопросы по тегам