Visual C ++ Header #define ошибка компилятора

Я изучаю C ++ и все еще на довольно низком уровне. — В настоящее время я смотрю на использование заголовочных файлов, и у меня есть вопрос из двух частей.

Часть 1

Как я понимаю, определения заголовочных файлов похожи на жестко закодированные строки в VB.net? Например, я могу сделать следующее #define STOCK_QUANTITY 300 а затем ссылаться на мое определение при использовании его внутри функций? Я предполагаю, что это работает так же, как строки VB.net, так как мне нужно только изменить значение в одном месте, если мне нужно внести изменения в определение, и моя программа ссылается на число 300 в нескольких сотнях разных строк?

Часть 2

Теперь, как я сказал, я все еще учусь, поэтому я все еще выполняю старые задачи умножения. Я хорошо использую функции с моим основным файлом .cpp, но я не перехожу к заголовочным файлам. Это мой фрагмент кода до сих пор.

add.h

#ifndef ADD_H
#define ADD_H

int add(int x, int y);

#endif

main.cpp

#include "stdafx.h"#include <iostream>
#include "add.h"
int main()
{
using namespace std;
cout << add(3, 4) << endl;
return 0;
}

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

Извиняюсь, что это глупые вопросы, но я был бы признателен за понимание, советы или даже некоторые другие вещи, которые я должен рассмотреть. Благодарю.

РЕДАКТИРОВАТЬ

На основании ответа я тоже изменил свой add.h

#ifndef ADD_H
#define ADD_H

int add(int x, int y)
{
return x + y;
}

#endif

Как только я прочитал ответ, я понял, что даже не сказал функции, что делать 🙁 — Черт возьми.

1

Решение

Вы не добавили тело функции для функции add

int add(int x, int y)
{
// add stuff here
}

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

4

Другие решения

Вы только что объявили, что функция add существует, поэтому вы можете назвать это. Но вы на самом деле не определять функция где угодно.

В C ++ вы должны различать декларация а также определение. Иногда это делается одновременно, как при объявлении локальной переменной. В других случаях вы разделяете их, например, когда у вас есть прототип функции в заголовочном файле (как у вас), тогда это объявление. Определение функции является реализацией функции.


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

Это Можно быть решена путем создания функции static или же inline, Или еще лучше, создайте новый исходный файл (например, add.cpp) где у вас есть определение add и сохраните только объявление (прототип) в заголовочном файле.

2

Что касается первой части вашего вопроса:
Хотя #defines делает, как вы описали, у них есть некоторые недостатки при использовании (например, они анализируются препроцессором, а не компилятором, поэтому нет проверки типов, а также вы можете получить прикольные ошибки, если у вас есть немного более сложные макросы.
Таким образом, хотя ваш оператор действителен, он определяет глобальную константу, которую вам нужно изменить только в одном месте, и которую можно использовать в нескольких местах, для этой цели лучше иметь фактическую переменную константы в заголовочном файле:
например

const int STOCK_QUANTITY = 300;

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

См. Также пункт 3 «Эффективного C ++» Скотта Мейера (который, по моему мнению, необходимо прочесть, если вы серьезно относитесь к программированию на c ++, хотя перед тем, как это прочесть, вам уже понадобится некоторый опыт).

1