Во-первых: Вы не должны ставить точку с запятой в конце #define
. #define
- это директива препроцессора, означающая, что она в основном выполняет замену текста определенного имени содержимым. Поэтому, если вы сделаете что-то вроде int a = SM_STOP + 1;
, оно будет предварительно обработано до int a = 1003; + 1;
с вашим кодом, а это не то, что вам нужно.
Второе: Заголовки обычно не компилируются сами по себе, а только для включения в *.cpp
файлы или другие заголовки (где #include
снова является текстовой подстановкой). Поэтому, да, вам нужно где-то иметь файл .cpp
(ну, не совсем, во-первых, вы можете выбрать другое расширение, а во-вторых, вы можете даже дать компилятору заголовок в качестве модуля компиляции, но я бы посоветовал против, по крайней мере, пока не узнаешь что делаешь). Однако вам не нужно иметь .cpp
файл для ваших констант, просто #include
ваш заголовок в любой файл, в котором вы хотите использовать константы.
В-третьих: почему вы используете препроцессор здесь? Это похоже на идеальную работу для перечисления. Затем вы можете поместить его в пространство имен / структуру для устранения необходимости префиксировать их (с SM_
). Или вы можете просто использовать новый C ++ 11 enum class
, который во многом похож на перечисления java. Я бы по возможности избегал препроцессоров. Так как это просто замена текста, и он не учитывает какую-либо область видимости и тому подобное, это облегчает возникновение проблем (например, с вашими точками с запятой).