जहां तक मुझे पता है, केवल inline
और टेम्पलेट फ़ंक्शंस हेडर फ़ाइलों में परिभाषित किया जा सकता है।
static
फ़ंक्शंस बहिष्कृत किए गए हैं, और एक अनाम नामस्थान में परिभाषित फ़ंक्शंस का उपयोग इसके बजाय किया जाना चाहिए (7.3.1.1 पी 2 देखें)। जब आप किसी हेडर में एक अनाम नामस्थान में फ़ंक्शन को परिभाषित करते हैं, तो उस शीर्षलेख (प्रत्यक्ष या परोक्ष रूप से) सहित प्रत्येक स्रोत कोड में एक अनूठी परिभाषा होगी (7.3.1.1 पी 1 देखें)। इसलिए, फ़ंक्शंस को हेडर फ़ाइलों में नामित नेमस्पेस में परिभाषित नहीं किया जाना चाहिए (केवल स्रोत फ़ाइलों में)।
मानक संदर्भ सी ++ 03 मानक से हैं।
संपादित करें:
अगला उदाहरण दर्शाता है क्यों कार्य करता है और चर हेडर में अज्ञात नाम स्थान में परिभाषित किया जाना चाहिए:
ops.hpp शामिल हैं:
#ifndef OPS_HPP
#define OPS_HPP
namespace
{
int a;
}
#endif
DK1 .एचपीपी में शामिल हैं:
#ifndef DK1_HPP
#define DK1_HPP
void setValue();
void printValue();
#endif
dk1.cpp शामिल हैं:
#include "dk1.hpp"
#include "ops.hpp"
#include <iostream>
void setValue()
{
a=5;
}
void printValue()
{
std::cout<<a<<std::endl;
}
dk।सीपीपी शामिल हैं:
#include "dk1.hpp"
#include "ops.hpp"
#include <iostream>
int main()
{
// set and print a
setValue();
printValue();
// set and print it again
a = 22;
std::cout<<a<<std::endl;
// print it again
printValue();
}
संकलित इस तरह:
g++ -ansi -pedantic -Wall -Wextra dk.cpp dk1.cpp
और आउटपुट:
5
22
5
ऑप्स चर a
स्रोत फ़ाइल dk1.cpp
और dk.cpp
स्रोत
2011-10-20 10:17:24
आप भूल गए: उन्हें फ़ंक्शन टेम्पलेट्स में बदलें। यही वह है जो मैं आमतौर पर पसंद करता हूं। – sbi
स्थिर का उपयोग न करें जो कई अलग-अलग प्रतियों और पागलपन की ओर जाता है। –
"प्रत्येक अज्ञात नेमस्पेस में एक प्रति" समाधान एक ही पागलपन की ओर जाता है। – MSalters