2014-10-03 106 views
1

下面的程序,當如C++使用GCC編譯編譯時4.8.1GCC中的PRIuPTR預處理器錯誤?

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

int main() { 
    uintptr_t i = 0; 
    i--; 
    printf("%" PRIuPTR "\n", i); 
    return 0; 
} 

提供了以下錯誤消息

a.cc: In function 'int main()': 
a.cc:8:13: error: expected ')' before 'PRIuPTR' 
    printf("%" PRIuPTR "\n", i); 
      ^

它編譯,並與微軟編譯器正常運行,甚至與海灣合作委員會爲C.

我錯過了什麼,或者這是GCC中的錯誤?如果是後者,是否有解決方法?

+1

您是否使用'-std = C++ 11'編譯爲C++ 11?在此之前,這不是標準的C++(作爲C99庫的一部分,而C++ 98僅包含C90庫)。 – 2014-10-03 15:52:01

+0

另外,你爲什麼要用編譯器編譯C代碼來使用不同的語言? – 2014-10-03 15:54:28

+0

@MikeSeymour是;這兩種方式都沒有區別。 – rwallace 2014-10-03 15:54:34

回答

3

C標準說這關於包括從C++的C頭:

C++實現應該定義僅當__STDC_FORMAT_MACROS定義被包括 之前<inttypes.h>這些宏。

而且GCC似乎遵循這個建議,而微軟卻沒有。

與其定義此宏幷包括不贊成使用的C標頭,更好的解決方案是使用C++標頭<cinttypes>,它無條件地定義這些宏。 (正如在評論中所指出,C++標準具體地說,宏對C++頭沒有影響。)

可替換地,停止使用C庫時,有一個更方便的(和類型安全)C++替代方案中,std::cout << i;

+0

27.9.2 C庫文件[c.files]:'[注:由定義的宏是無條件提供的。 特別是,在C標準腳註182中提到的符號__STDC_FORMAT_MACROS 在C++中不起作用。 - 注意]'這是C++ 11 +中唯一提到的宏。 – Deduplicator 2014-10-03 16:08:33

+0

'[c.files]'§4明確地說,標題應該有相同的內容,除了一些不相關的變化。 – Deduplicator 2014-10-03 16:13:31

+0

@Deduplicator:他們這麼做;不同之處在於這些宏在C頭文件(當從C++包含時)是有條件的,並且在C++頭文件中是無條件的。 – 2014-10-03 16:19:52