C ++: использование внешней связи с безымянным пространством имен для использования постоянной переменной - PullRequest
0 голосов
/ 09 марта 2019

Моя цель заключается в том, чтобы при вызове myFunction изнутри main мне не приходилось передавать константу SIZE.Затем следует запустить функцию в myFunction.cpp и просто вывести содержимое массива.

Я прочитал некоторые заметки о внешней связи, но мне кажется, что я недостаточно хорошо понимаю, чтобы что-то применить в этомдело.В идеале main.cpp не должен изменяться, кроме как при предоставлении пространства имен, включая SIZE, если это абсолютно необходимо.

main.cpp

#include <iostream>
#include "myFunction.hpp"

namespace
{
    extern const int SIZE = 10;
}

void myFunction(char []);

int main()
{
    char myArray[SIZE] = "123456789";

    myFunction(myArray);
}

myFunction.h

#ifndef MYFUNCTION_H_INCLUDED
#define MYFUNCTION_H_INCLUDED

namespace
{
    extern const int SIZE;
}

#endif // MYFUNCTION_H_INCLUDED

myFunction.cpp

#include <iostream>

void myFunction(char myArray[])
{
    for(int i = 0; i < SIZE; ++i)
    {
        std::cout << myArray[i] << " ";
    }
}

С тем, что у меня есть, я все еще получаю сообщение об ошибке, что SIZE не был объявлен вэта область (myFunction.cpp).

Вопрос: Что мне нужно сделать, чтобы этот пример работал?Если возможно, я бы также хотел, чтобы объяснение объяснило, почему можно было бы разделить РАЗМЕР таким способом.

1 Ответ

0 голосов
/ 09 марта 2019

Пространство имен без имени сообщает компилятору, что ничто внутри не должно использоваться совместно с другим модулем перевода. (То есть все внутри имеет внутреннюю связь .) Пока SIZE находится в безымянном пространстве имен , оно не может иметь внешнюю связь , поэтому оно невозможно увидеть от myFunction().

Если возможно, мне бы также хотелось, чтобы объяснение того, почему можно было бы делиться РАЗМЕРОМ таким образом.

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

Для более реалистичного примера, возможно, строка версии будет и простой, и хорошей? Ваше приложение может иметь версию (например, «1.69.8109»), которая отображается в различных точках. Эта версия может быть объявлена ​​как const string, которая используется несколькими исходными файлами. Он вошел бы в (именованное) пространство имен, чтобы избежать конфликтов имен. Он может быть определен в исходном файле, а не в заголовочном файле, чтобы ограничить объем повторной компиляции, необходимый при изменении версии. (Необходимо перекомпилировать только источник с определением, а не каждый источник, использующий строку версии.) Это может быть разумным преимуществом, особенно если номер версии изменяется достаточно часто, а не обязательно только при подготовке нового выпуска.

(из комментариев):"Попробуйте заставить это работать. Вы можете дать безымянному пространству имен, содержащему SIZE, имя, если это поможет"

Забавно, как часто инструкции к упражнению говорят вам, что делать. (Хех, "если".)

...