Ubica
Ubica

Reputation: 1051

How to avoid -fpermissive?

I wrote the following code example and I've had to use -fpermissive to skip the error/warning

#include <iostream>
#include <vector>
using namespace std;

int endOfProgram(){
    printf("\n\npress return key to close the program...");
    char end[2];
    fgets(end, 2, stdin);
    return 0;
}

void pointerTest(vector<int> * pointer){
    printf("%d\n", pointer);
    printf("%#x\n", (unsigned)pointer);
    for (auto it = (*pointer).begin(); it < (*pointer).end(); it++)
        printf("%d ", *it);
}

int main(){
    vector<int> numbers = { 1, 2, 3, 4, 5, 6 };
    pointerTest(&numbers);
    endOfProgram();
}

error/warning message:

@test:~/workspace $ make
g++ -std=c++11 pointerTest.cc -o pointerTest -fpermissive
pointerTest.cc: In function ‘void pointerTest(std::vector<int>*)’:
pointerTest.cc:13:24: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘std::vector<int>*’ [-Wformat=]
  printf("%d\n", pointer);
                        ^
pointerTest.cc:14:28: warning: cast from ‘std::vector<int>*’ to ‘unsigned int’ loses precision [-fpermissive]
  printf("%#x\n", (unsigned)pointer);
                            ^

obviously these two lines are problematic...

printf("%d\n", pointer);
printf("%#x\n", (unsigned)pointer);

the question: How can I write these lines, in order to avoid using -fpermissive?

Upvotes: 0

Views: 403

Answers (2)

Brian Bi
Brian Bi

Reputation: 119552

  1. Don't use %d to print out a pointer. It's undefined behaviour.
  2. Use the %p format specifier to print out a pointer, rather than trying to cast it to an integer.

Upvotes: 3

Barry
Barry

Reputation: 303800

There's a special escape for pointers:

printf("%p\n", pointer);

Alternatively, but strictly less preferred:

printf("%lu\n", uintptr_t(pointer));

The former would print something like 0x7fffc3488bbc while the latter would print a decimal version 140736469699516.

Upvotes: 2

Related Questions