2013-10-29 13 views
5

Tôi đã viết những vấn đề thử nghiệm nhỏ nhất có thể:MinGW g ++ không nhận off_t khi biên dịch với C++ 11

#include <sys/types.h> 
int main(int argc, char** argv) { 
    off_t l = 0; 
    return 0; 
} 

Các công trình sau đây: g++ test.cpp

Nhưng nếu tôi cố gắng biên dịch với c + 11 tôi nhận được:

c: \ test> g ++ -std = C++ 11 test.cpp

test.cpp: In function 'int main(int, char**)': 
test.cpp:5:2: error: 'off_t' was not declared in this scope 
test.cpp:5:8: error: expected ';' before 'l' 
test.cpp:6:9: error: 'l' was not declared in this scope 

Bất cứ ai cũng có thể giải thích tại sao điều này xảy ra? Lý do là làm phiền tôi là tôi đang cố gắng sử dụng thư viện zlib trong mã C++ 11 của tôi. Thư viện zlib.h sử dụng off_t rất nhiều.

phiên bản trình biên dịch của tôi là: gcc 4.7.2

Using built-in specs. 
COLLECT_GCC=g++ 
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.7.2/lto-wrapper.exe 
Target: mingw32 
Configured with: ../gcc-4.7.2/configure --enable-languages=c,c++,ada,fortran,objc,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --disable-build-poststage1-with-cxx --enable-version-specific-runtime-libs -build=mingw32 --prefix=/mingw 
Thread model: win32 
gcc version 4.7.2 (GCC) 
+1

khi tôi so sánh: 'g ++ -E test.cpp> test.c' &' g ++ -std = C++ 11 -E test.cpp> test.c' Tôi có thể thấy rằng không có C++ 11 Tôi có 'typedef long _off_t; ' ' typedef _off_t off_t; ' và với std = C++ 11 Tôi chỉ có' ​​typedef long _off_t; ' – odedsh

+0

Ok vậy là do __STRICT_ANSI__ được xác định khi sử dụng -std = C++ 11 Tôi có thể tìm ra từ đây – odedsh

Trả lời

5

Khi sử dụng tùy chọn -std = C++ 11 trình biên dịch được xác định -D__STRICT_ANSI__ mà loại bỏ các định nghĩa của off_t chỉ để lại _off_t xác định.

Trình biên dịch là chính xác để làm điều đó vì off_t không tuân thủ tiêu chuẩn.

Điều này gây nhầm lẫn với tôi vì tôi muốn C++ 11 cho những nội dung thú vị như nullptr & lambdas. Tôi không quan tâm đến STRICT_ANSI chút nào.

Giải pháp là để làm việc với -std = gnu ++ 11

(Một lựa chọn khác là chỉ cần typedef off_t cho các tập tin tiêu đề mà cần nó typedef _off_t off_t;)

Các vấn đề liên quan