Есть ли способ напечатать long int и int с одинаковым флагом формата? - PullRequest
3 голосов
/ 14 марта 2012

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

    #ifdef LONG_IDX
    typedef long int idx_type
    #else
    typedef int idx_type
    #endif

В моем коде есть несколько операторов printf для распечатки этих индексных данных, и я не хочу оборачивать их в операторы #ifdef повсюду. Есть ли флаг формата для указания, что аргумент может быть long int или int? Если нет, есть ли способ определить собственный флаг формата, который я мог бы просто добавить в определение типа индекса?

Ответы [ 4 ]

12 голосов
/ 14 марта 2012

Вы можете условно определить форматер для вашего типа индекса:

#ifdef LONG_IDX
typedef long long int idx_type
#define IDX_FORMAT "lld"
#else
typedef int idx_type
#define IDX_FORMAT "d"
#endif

Тогда вам, конечно, нужно использовать это в вызовах форматирования, что может стать немного громоздким и (как всегда!) Требует от васбыть бдительным и не забывайте делать это правильно, когда вы хотите напечатать индекс:

idx_type my_index = 47;

print("my_index = %" IDX_FORMAT, my_index);

Обратите внимание, как вышеизложенное использует автоматическую конкатенацию C смежных строковых литералов для «сборки» правильной строки форматирования во время компиляции,Это типичное использование этой удивительной функции синтаксиса C.

Кроме того, если ваш компилятор достаточно хорош для форматирования проверки строк (GCC делает), вы, скорее всего, получите полезные предупреждения, если вы все испортите изабудьте где-нибудь использовать строку defined.

9 голосов
/ 14 марта 2012

Я бы использовал %lli (длинное длинное целое) и выполнял приведение при печати:

idx_type idx;

printf("%lli", (long long int) idx);

Я думаю, что это дает вам наибольшую надежность в том, что будет напечатано.

2 голосов
/ 14 марта 2012

Самый простой способ - всегда использовать "вверх".

#include <stdio.h>

int main(void)
{
    char c = 1;
    int i = 12;
    long int l = 123;
    long long int ll = 1234;

    printf("c=%lld i=%lld l=%lld ll=%lld\n", 
            (long long int) c, 
            (long long int) i, 
            (long long int) l, 
            (long long int) ll
          );
    return 0;
}
0 голосов
/ 14 марта 2012

Либо используйте %d для десятичной печати printf, либо std::cout.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...