Я изучаю 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
Как только я прочитал ответ, я понял, что даже не сказал функции, что делать 🙁 — Черт возьми.
Вы не добавили тело функции для функции add
int add(int x, int y)
{
// add stuff here
}
Это можно сделать либо в заголовочном файле, либо в отдельном файле cpp для добавления. Вы пытаетесь вызвать функцию без кода. Это известно как прототип функции.
Вы только что объявили, что функция add
существует, поэтому вы можете назвать это. Но вы на самом деле не определять функция где угодно.
В C ++ вы должны различать декларация а также определение. Иногда это делается одновременно, как при объявлении локальной переменной. В других случаях вы разделяете их, например, когда у вас есть прототип функции в заголовочном файле (как у вас), тогда это объявление. Определение функции является реализацией функции.
После редактирования у вас теперь есть другая проблема. Иными словами, если вы включите заголовочный файл в несколько исходных файлов, для каждого из этих исходных файлов (формально называемых единицами перевода) будет определена функция, и из-за этого вы получите ошибку.
Это Можно быть решена путем создания функции static
или же inline
, Или еще лучше, создайте новый исходный файл (например, add.cpp
) где у вас есть определение add
и сохраните только объявление (прототип) в заголовочном файле.
Что касается первой части вашего вопроса:
Хотя #defines делает, как вы описали, у них есть некоторые недостатки при использовании (например, они анализируются препроцессором, а не компилятором, поэтому нет проверки типов, а также вы можете получить прикольные ошибки, если у вас есть немного более сложные макросы.
Таким образом, хотя ваш оператор действителен, он определяет глобальную константу, которую вам нужно изменить только в одном месте, и которую можно использовать в нескольких местах, для этой цели лучше иметь фактическую переменную константы в заголовочном файле:
например
const int STOCK_QUANTITY = 300;
Теперь вы явно называете его целым числом, а также компилятор может выполнять дополнительную проверку.
См. Также пункт 3 «Эффективного C ++» Скотта Мейера (который, по моему мнению, необходимо прочесть, если вы серьезно относитесь к программированию на c ++, хотя перед тем, как это прочесть, вам уже понадобится некоторый опыт).