如何避免-fpermissive?

时间:2014-12-14 23:46:32

标签: c++ pointers

我编写了以下代码示例,我必须使用-fpermissive跳过错误/警告

#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();
}

错误/警告信息:

@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);
                            ^
显然这两行是有问题的......

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

问题:如何编写这些行,以避免使用-fpermissive?

2 个答案:

答案 0 :(得分:3)

  1. 请勿使用%d打印指针。这是未定义的行为。
  2. 使用%p格式说明符打印指针,而不是尝试将其转换为整数。

答案 1 :(得分:2)

指针有一个特殊的转义:

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

或者,但严格不太优选:

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

前者会打印0x7fffc3488bbc之类的内容,而后者会打印十进制版本140736469699516