Для функций, которые вы хотите, ...
- получить длину во время компиляции,
- может быть включено в .h без всяких жалоб со стороны компоновщика,
- нет нескольких копий в .o, в связанном выводе,
... вы можете использовать шаблонную константу , например
template< class Dummy >
struct Foo_
{
static char const s[];
};
template< class Dummy >
char const Foo_<Dummy>::s[] = "Blah blah";
typedef Foo_<void> Foo; // Now you can refer to Foo:s
#include <iostream>
using namespace std;
int main()
{
cout << sizeof( Foo::s ) << " bytes: \"" << Foo::s << "\"\n";
}
Вы можете обернуть поколение в макрос.
Однако, насколько мне известно, единственная практическая утилита - это поддержка кода char / wchar_t-agnostic, и для этого боль может быть больше, чем усиление.
EDIT
MSVC версии 7.1 до 10.0 неправильно не принимает sizeof
. Ниже представлен обходной путь, который прекрасно компилируется с g ++ 4.4.1, Comeau Online 4.3.10.1, MSVC 7.1 и MSVC 10.0.
#include <stddef.h>
typedef ptrdiff_t Size;
// Substitute a more general countOf
template< Size n >
struct SizedBuf { char sizer[n]; };
template< class Type, Size n >
SizedBuf< n > countOf_( Type (&)[n] ) { return n; }
#define COUNT_OF( array ) sizeof( countOf_( array ).sizer )
#define DEF_STRING( name, value ) \
template< class > \
struct name##_constant_ \
{ \
static char const str[]; \
static Size const length = COUNT_OF( value ) - 1; \
}; \
\
template< class Type > \
char const name##_constant_< Type >::str[] = value; \
\
template< class Type > \
Size const name##_constant_< Type >::length; \
\
typedef name##_constant_<void> name;
DEF_STRING( a, "Argh, MSVC!" )
DEF_STRING( b, "Blah blah" )
DEF_STRING( c, "Currently there's no 'inline' for data in C++." )
#include <iostream>
template< char const* s >
void foo() { std::cout << "foo() says: " << s << std::endl; }
int main()
{
using namespace std;
int const x[a::length] = {}; // Showing off compile time constant.
foo<a::str>(); // Showing off external linkage.
cout << a::length << " characters: \"" << a::str << "\"." << endl;
}
Приветствия и hth.,