int64_t в функции printf borland c ++ builder 6 [duplicate]

Члены класса:

Для деструктора pure virtual требуется реализация.

Объявление деструктора по-прежнему требует определения его (в отличие от обычной функции):

struct X
{
    virtual ~X() = 0;
};
struct Y : X
{
    ~Y() {}
};
int main()
{
    Y y;
}
//X::~X(){} //uncomment this line for successful definition

Это происходит потому, что деструкторы базового класса вызывается, когда объект уничтожается неявно, поэтому требуется определение.

virtual методы должны быть реализованы или определены как чистые.

Это похоже на методы не virtual без определения, с добавлением аргументов, которые генерирует чистая декларация dummy vtable, и вы можете получить ошибку компоновщика без использования функции:

struct X
{
    virtual void foo();
};
struct Y : X
{
   void foo() {}
};
int main()
{
   Y y; //linker error although there was no call to X::foo
}

Чтобы это сработало, объявите X::foo() чистым:

struct X
{
    virtual void foo() = 0;
};

Non- virtual

Некоторые члены должны быть определены, даже если они явно не используются:

struct A
{ 
    ~A();
};

Следующие ошибки приведут к ошибке:

A a;      //destructor undefined

Реализация может быть встроенной в самом определении класса:

struct A
{ 
    ~A() {}
};

или снаружи:

A::~A() {}

Если реализация вне определения класса, но в заголовке, методы должны быть отмечены как inline, чтобы предотвратить множественное определение.

Все используемые методы-члены должны быть определены, если они используются.

Общей ошибкой является отказ от квалификации имени:

struct A
{
   void foo();
};

void foo() {}

int main()
{
   A a;
   a.foo();
}

Определение должно быть

void A::foo() {}

static. Члены данных должны быть определены вне класса в единственная единица перевода:

struct X
{
    static int x;
};
int main()
{
    int x = X::x;
}
//int X::x; //uncomment this line to define X::x

Инициализатор может быть предоставлен для элемента данных static const типа интеграла или перечисления в определении класса; однако odr-использование этого элемента по-прежнему потребует определения области пространства имен, как описано выше. C ++ 11 позволяет инициализировать внутри класса для всех членов static const данных.

221
задан Eric Leschinski 12 August 2013 в 19:50
поделиться

6 ответов

Исходя из встроенного мира, где даже uclibc не всегда доступен, а код типа

uint64_t myval = 0xdeadfacedeadbeef; printf("%llx", myval);

печатает вас дерьмо или вообще не работает - я всегда используйте крошечный помощник, который позволяет мне правильно сбрасывать uint64_t hex:

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

char* ullx(uint64_t val)
{
    static char buf[34] = { [0 ... 33] = 0 };
    char* out = &buf[33];
    uint64_t hval = val;
    unsigned int hbase = 16;

    do {
        *out = "0123456789abcdef"[hval % hbase];
        --out;
        hval /= hbase;
    } while(hval);

    *out-- = 'x', *out = '0';

    return out;
}
5
ответ дан ataraxic 27 August 2018 в 20:51
поделиться

// VC6.0 (386 & amp; лучше)

    __int64 my_qw_var = 0x1234567890abcdef;

    __int32 v_dw_h;
    __int32 v_dw_l;

    __asm
        {
            mov eax,[dword ptr my_qw_var + 4]   //dwh
            mov [dword ptr v_dw_h],eax

            mov eax,[dword ptr my_qw_var]   //dwl
            mov [dword ptr v_dw_l],eax

        }
        //Oops 0.8 format
    printf("val = 0x%0.8x%0.8x\n", (__int32)v_dw_h, (__int32)v_dw_l);

С уважением.

-1
ответ дан Daniel Ag 27 August 2018 в 20:51
поделиться

В среде Windows используйте

%I64d

в Linux, используйте

%lld
4
ответ дан Keith Thompson 27 August 2018 в 20:51
поделиться

С C99 модификатор длины %j также может использоваться с семейством функций printf для типов int64_t и uint64_t:

#include <stdio.h>
#include <stdint.h>

int main(int argc, char *argv[])
{
    int64_t  a = 1LL << 63;
    uint64_t b = 1ULL << 63;

    printf("a=%jd (0x%jx)\n", a, a);
    printf("b=%ju (0x%jx)\n", b, b);

    return 0;
}

. Компиляция этого кода с помощью gcc -Wall -pedantic -std=c99 не выдает предупреждений, а программа печатает ожидаемый результат:

a=-9223372036854775808 (0x8000000000000000)
b=9223372036854775808 (0x8000000000000000)

Это соответствует printf(3) в моей системе Linux (на странице руководства указано, что j используется для указания преобразования к intmax_t или uintmax_t, в моем stdint.h оба int64_t и intmax_t точно подобраны, и аналогично для uint64_t). Я не уверен, что это совершенно портативно для других систем.

11
ответ дан pjhsea 27 August 2018 в 20:51
поделиться

Путь C99 -

#include <inttypes.h>
int64_t my_int = 999999999999999999;
printf("%" PRId64 "\n", my_int);

Или вы можете использовать!

printf("%ld", (long)my_int);
printf("%lld", (long long)my_int); /* C89 didn't define `long long` */
printf("%f", (double)my_int);

Если вы застряли в реализации C89 (особенно Visual Studio), вы можете использовать открытый источник <inttypes.h><stdint.h>): http://code.google.com/p/msinttypes/

50
ответ дан pmg 27 August 2018 в 20:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: