Я следую простому учебнику, чтобы создать DLL.
В процессе, я немного запутался с некоторыми обозначениями в файле cpp
dll.h - the header file
#blablablabla
namespace TutTest {
class TutTestClass { //for very complicated math!!!
public:
static dll_API double Add(double a, double b);
static dll_API double Subtract(double a, double b);
static dll_API double Multiply(double a, double b);
};
}
dll.cpp - the cpp file :)
#blablablabla include and such
namespace TutTest{
double TutTest::Add(double a, double b){
return a + b;
}
double TutTestClass::Subtract(double a, double b){
return a - b;
}
double TutTest::TutTestClass::Multiply(double a, double b){
return a * b;
}
}
В приведенном выше файле .cpp нотацией по умолчанию (используемой в учебном пособии) является «double TutTest :: …», однако я поэкспериментировал с этим и заметил, что и «TutTestClass ::», и «TutTest :: TutTestClass :: msgstr «кажется действительным, так как среда IDE не выдает никаких ошибок / предупреждений.
Так что мне было интересно, означают ли 3 обозначения то же самое? они эквивалентны?
если да, есть ли разница между нотациями, кроме стиля персонального кодирования?
Или эти обозначения отличаются по значению друг от друга?
TutTestClass::Subtract
правильный. Subtract
является (статической) функцией-членом класса TutTestClass
так что вы должны квалифицировать его соответственно.
TutTest::TutTestClass::Multiply
технически правильно, но странно. Внутри пространства имен TutTest
, имя TutTestClass
относится к TutTest::TutTestClass
автоматически, поэтому излишне явно указывать это имя.
TutTest::Add
не должен компилироваться. Что это пытается сделать, это определить функцию пространства имен области Add
в пространстве имен TutTest
, Однако вы можете использовать только определенное имя для объявления функции области имен, когда
функция уже была объявлена в пространстве имен AND
объявление происходит вне пространство имен в вопросе.
Ничто из этого не относится к вашему делу.
Пространство имен включает себя и свои якорные магазины, следовательно TutTest::
внутри TutTest
ничего не делает.
Но только из-за этого, TutTest::Add
это не то же самое, что TutTest::TutTestClass::Add
, (вы на самом деле определяете другую функцию, которая никогда не была объявлена)
внутри namaspace TutTest { ... }
ты можешь избежать TutTest::
но чтобы определить членов класса (даже если они статические) за пределами классов, вам нужно указать имя функции в соответствии с классом, которому она принадлежит.