Ошибка нескольких определений

0

Я опубликовал этот вопрос, потому что я застрял в очень странной проблеме. У меня есть проект из нескольких файлов.cpp и нескольких заголовков. В частности, этот фрагмент кода появляется в трех разных файлах.cpp:

void printGraph2d(std::vector < std::vector <plotData> > data, double dy, double dt, const unsigned int M, unsigned int intervalliTemporali);
void printGraph3d(std::vector < std::vector <plotData> > data, double dy, double dt, const unsigned int M, unsigned int intervalliTemporali);
double alpha = 0.000217f;
double hBarra = 0.04f;
double uWall = 100;
double dt = 0.0001f;
const unsigned int Y = 41;
const unsigned int M = 15000;
double dy = hBarra/(Y - 1);
double grid [M][Y];
std::vector <std::array <double, 4> > tridiagonal;
unsigned int intervalliTemporali;

и имеют различную роль в каждом файле. Интересно, почему компилятор получает "ошибку нескольких определений". Прототипы двух функций и переменные определяются ТОЛЬКО в файлах.cpp (не в любых заголовках) и используются только в файлах, где они объявлены.

Я решил эту ошибку, поставив слово "статический" перед объявлением, он работал нормально, но у меня были некоторые проблемы с отладчиком (не отображая значения переменных). Я узнал, что если я переименую переменные и функции выше, проблемы с отладчиком исчезнут. Вместо переименования переменных я решил объявить переменные внутри функции, а не глобально. Я не переименовал функции. Таким образом, программа вылетает каждый раз, когда я вызываю функцию "cranknicolson1()", когда она вызывается и что-то делает. Я думаю, что это очень странное поведение вызвано словом "статический" перед прототипами функции, потому что я не могу это объяснить! Вот мой код. http://qpwoei.altervista.org/Code.zip Я подчеркиваю, что код врезался в cranknicolson1(), прежде чем что-либо делать! Поэтому нет проблем с алгоритмом cranknicolson, но что-то еще. Надеюсь, кто-то может мне помочь, спасибо вам заранее!

  • 0
    Ваша проблема с вашей функцией cranknicolson1 отличается от этой проблемы. Задайте это как отдельный вопрос.
  • 0
    Спасибо за предложение, я создал другую тему: stackoverflow.com/questions/21971827/… Надеюсь, вы можете мне помочь!
Теги:
visual-studio-2012
multiple-definition-error

2 ответа

1
Лучший ответ

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

Вы можете поместить их в неназванное пространство имен, так как mike.did предлагает или квалифицирует их как статические, что и было вами. Однако оба решения обходят реальную проблему: почему у вас так много глобальных переменных? Ваш код не очень объектно ориентирован.

Ваша проблема с вашей функцией cranknicolson1 отличается от этой проблемы. Задайте это как отдельный вопрос.

0

Вам необходимо свести область определения к соответствующим.cpp файлам с помощью анонимных пространств имен. В противном случае символы публикуются и могут использоваться в других единицах перевода.

Вы также можете прочитать о том, почему используются неназванные пространства имен и каковы их преимущества? , Что делает помещение в анонимное пространство имен? , Безымянные/анонимные пространства имен или статические функции и другие поддерживающие темы здесь (просто следуйте ссылкам).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню