如何检查 Linux 操作系统中使用的 C 版本?

新手上路,请多包涵

我试图打印:

 std::cout << __cplusplus;

并获得 1 作为输出。

我也试过: g++ -version 命令。它产生输出:

 g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-17)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

如何通过上述输出确定 C++ 标准的版本?

或者还有其他方法吗??

我发现在某个地方, Boost.Config 有大量的宏,可用于测试对特定 C++11 功能的支持。

原文由 Kumar Dewasish 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

我试图打印:

>  std::cout << __cplusplus;
>
> ```
>
> 并获得 1 作为输出

听起来 `__cplusplus` 被强制转换为 `bool` 。您可能应该显示完整的代码,而不是删节的代码片段。

也许您可以将 `__cplusplus` 转换为 `unsigned` 类型。或者,也许您需要包含一个 c++ 标头,例如 `<iostream>` 。但是,这样做时我无法重现您的结果:

$ cat test.cxx #include int main(int argc, char* argv[]) { std::cout << cplusplus << std::endl; std::cout << (unsigned int)cplusplus << std::endl; return 0; }

$ ./test.exe 201402 201402


* * *

> 如何确定具有上述输出的版本?或者还有其他方法吗??

通常你要求编译器把它们给你。另请参阅 `echo '#include <iostream>' | g++ -x c++ -dM -E - | sort` 的输出。下面的一个来自带有 GCC 6.3 的 Fedora 25。

您可以通过添加 `-march=native` 来为您拥有的特定 CPU 调整更多宏。然后你会看到预处理器定义,如 `__AES__` , `__PCLMUL__` , `__SHA__` 等。

您还可以将不同版本的 C++ 标准与 `-std=c++03` 、 `-std=c++11` 、 `-std=c++14` 等一起使用。

$ echo ‘#include ’ | g++ -x c++ -dM -E - | sort #define ADJ_ESTERROR 0x0008 #define ADJ_FREQUENCY 0x0002 #define ADJ_MAXERROR 0x0004 #define ADJ_MICRO 0x1000 #define ADJ_NANO 0x2000 #define ADJ_OFFSET 0x0001 #define ADJ_OFFSET_SINGLESHOT 0x8001 #define ADJ_OFFSET_SS_READ 0xa001 #define ADJ_SETOFFSET 0x0100 #define ADJ_STATUS 0x0010 #define ADJ_TAI 0x0080 #define ADJ_TICK 0x4000 #define ADJ_TIMECONST 0x0020 #define _ALLOCA_H 1 #define alloca(size) __builtin_alloca (size) #define _ALLOCATOR_H 1 #define _ALLOC_TRAITS_H 1 #define __always_inline __inline attribute ((always_inline)) #define __amd64 1 #define amd64 1 #define _ANSI_STDDEF_H #define _ASM_GENERIC_ERRNO_BASE_H #define _ASM_GENERIC_ERRNO_H #define __ASMNAME2(prefix,cname) __STRING (prefix) cname #define __ASMNAME(cname) ASMNAME2 (USER_LABEL_PREFIX__, cname) #define _ATFILE_SOURCE 1 #define __ATOMIC_ACQ_REL 4 #define __ATOMIC_ACQUIRE 2 #define __ATOMIC_CONSUME 1 #define __ATOMIC_HLE_ACQUIRE 65536 #define __ATOMIC_HLE_RELEASE 131072 #define __ATOMIC_RELAXED 0 #define __ATOMIC_RELEASE 3 #define __ATOMIC_SEQ_CST 5 … #define _T_PTRDIFF #define _TPTRDIFF #define __try try #define _T_SIZE #define _TSIZE #define _T_WCHAR #define _TWCHAR #define _TYPEINFO #define __U16_TYPE unsigned short int #define __U32_TYPE unsigned int #define __U64_TYPE unsigned long int #define __u_char_defined #define __uid_t_defined #define __UID_T_TYPE __U32_TYPE #define __UINT16_C© c #define UINT16_C© c #define UINT16_MAX 0xffff #define UINT16_MAX (65535) #define UINT16_TYPE short unsigned int #define UINT16_WIDTH 16 #define __UINT32_C© c ## U #define UINT32_C© c ## U #define UINT32_MAX 0xffffffffU #define UINT32_MAX (4294967295U) #define __uint32_t_defined #define UINT32_TYPE unsigned int #define UINT32_WIDTH 32 #define __UINT64_C© c ## UL #define UINT64_C© c ## UL #define UINT64_MAX 0xffffffffffffffffUL #define UINT64_MAX (__UINT64_C(18446744073709551615)) #define UINT64_TYPE long unsigned int #define UINT64_WIDTH 64 #define __UINT8_C© c #define UINT8_C© c #define UINT8_MAX 0xff #define UINT8_MAX (255) #define UINT8_TYPE unsigned char #define UINT8_WIDTH 8 #define UINT_FAST16_MAX 0xffffffffffffffffUL #define UINT_FAST16_MAX (18446744073709551615UL) #define UINT_FAST16_TYPE long unsigned int #define UINT_FAST16_WIDTH __WORDSIZE #define UINT_FAST32_MAX 0xffffffffffffffffUL #define UINT_FAST32_MAX (18446744073709551615UL) #define UINT_FAST32_TYPE long unsigned int #define UINT_FAST32_WIDTH __WORDSIZE #define UINT_FAST64_MAX 0xffffffffffffffffUL #define UINT_FAST64_MAX (__UINT64_C(18446744073709551615)) #define UINT_FAST64_TYPE long unsigned int #define UINT_FAST64_WIDTH 64 #define UINT_FAST8_MAX 0xff #define UINT_FAST8_MAX (255) #define UINT_FAST8_TYPE unsigned char #define UINT_FAST8_WIDTH 8 #define UINT_LEAST16_MAX 0xffff #define UINT_LEAST16_MAX (65535) #define UINT_LEAST16_TYPE short unsigned int #define UINT_LEAST16_WIDTH 16 #define UINT_LEAST32_MAX 0xffffffffU #define UINT_LEAST32_MAX (4294967295U) #define UINT_LEAST32_TYPE unsigned int #define UINT_LEAST32_WIDTH 32 #define UINT_LEAST64_MAX 0xffffffffffffffffUL #define UINT_LEAST64_MAX (__UINT64_C(18446744073709551615)) #define UINT_LEAST64_TYPE long unsigned int #define UINT_LEAST64_WIDTH 64 #define UINT_LEAST8_MAX 0xff #define UINT_LEAST8_MAX (255) #define UINT_LEAST8_TYPE unsigned char #define UINT_LEAST8_WIDTH 8 #define __UINTMAX_C© c ## UL #define UINTMAX_C© c ## UL #define UINTMAX_MAX 0xffffffffffffffffUL #define UINTMAX_MAX (__UINT64_C(18446744073709551615)) #define UINTMAX_TYPE long unsigned int #define UINTMAX_WIDTH 64 #define __u_intN_t(N,MODE) typedef unsigned int u_int ##N ##_t attribute ((mode (MODE))) #define UINTPTR_MAX 0xffffffffffffffffUL #define UINTPTR_MAX (18446744073709551615UL) #define UINTPTR_TYPE long unsigned int #define UINTPTR_WIDTH __WORDSIZE #define __ULONG32_TYPE unsigned int #define __ULONGWORD_TYPE unsigned long int #define __unix 1 #define unix 1 #define unix 1 #define __UQUAD_TYPE unsigned long int #define __USE_ATFILE 1 #define __useconds_t_defined #define __USECONDS_T_TYPE __U32_TYPE #define __USE_FORTIFY_LEVEL 0 #define __USE_GNU 1 #define __USE_ISOC11 1 #define __USE_ISOC95 1 #define __USE_ISOC99 1 #define __USE_ISOCXX11 1 #define __USE_LARGEFILE 1 #define __USE_LARGEFILE64 1 #define __USE_MISC 1 #define __USE_POSIX 1 #define __USE_POSIX199309 1 #define __USE_POSIX199506 1 #define __USE_POSIX2 1 #define USER_LABEL_PREFIX #define __USE_UNIX98 1 #define __USE_XOPEN 1 #define __USE_XOPEN2K 1 #define __USE_XOPEN2K8 1 #define __USE_XOPEN2K8XSI 1 #define __USE_XOPEN2KXSI 1 #define __USE_XOPEN_EXTENDED 1 #define __USING_NAMESPACE_C99(name) #define __USING_NAMESPACE_STD(name) #define __UWORD_TYPE unsigned long int #define __va_arg_pack() __builtin_va_arg_pack () #define __va_arg_pack_len() __builtin_va_arg_pack_len () #define _VA_LIST_DEFINED #define VERSION “7.1.1 20170622 (Red Hat 7.1.1-3)” #define __WALL 0x40000000 #define __warnattr(msg) attribute((warning (msg))) #define __warndecl(name,msg) extern void name (void) attribute((warning (msg))) #define _WCHAR_H 1 #define WCHAR_MAX 0x7fffffff #define __WCHAR_MAX WCHAR_MAX #define WCHAR_MAX __WCHAR_MAX #define WCHAR_MIN (-WCHAR_MAX - 1) #define __WCHAR_MIN WCHAR_MIN #define WCHAR_MIN __WCHAR_MIN #define wchar_t #define __WCHAR_T #define WCHAR_T #define _WCHAR_T #define _WCHART #define _WCHAR_T_DECLARED #define _WCHAR_T_DEFINED #define _WCHAR_TDEFINED #define _WCHAR_T_H #define WCHAR_TYPE int #define WCHAR_WIDTH 32 #define WCHAR_WIDTH 32 #define __WCLONE 0x80000000 #define __W_CONTINUED 0xffff #define WCONTINUED 8 #define __WCOREDUMP(status) ((status) & __WCOREFLAG) #define __WCOREFLAG 0x80 #define _WCTYPE_H 1 #define WEOF (0xffffffffu) #define __W_EXITCODE(ret,sig) ((ret) << 8 | (sig)) #define WEXITED 4 #define __WEXITSTATUS(status) (((status) & 0xff00) >> 8) #define WEXITSTATUS(status) __WEXITSTATUS (status) #define __WIFCONTINUED(status) ((status) == __W_CONTINUED) #define WIFCONTINUED(status) __WIFCONTINUED (status) #define WIFEXITED(status) __WIFEXITED (status) #define WIFEXITED(status) (WTERMSIG(status) == 0) #define __WIFSIGNALED(status) (((signed char) (((status) & 0x7f) + 1) >> 1) > 0) #define WIFSIGNALED(status) __WIFSIGNALED (status) #define __WIFSTOPPED(status) (((status) & 0xff) == 0x7f) #define WIFSTOPPED(status) __WIFSTOPPED (status) #define WINT_MAX 0xffffffffU #define WINT_MAX (4294967295u) #define WINT_MIN (0u) #define WINT_MIN 0U #define _WINT_T #define WINT_TYPE unsigned int #define WINT_WIDTH 32 #define WINT_WIDTH 32 #define WNOHANG 1 #define __WNOTHREAD 0x20000000 #define WNOWAIT 0x01000000 #define __WORDSIZE 64 #define __WORDSIZE_TIME64_COMPAT32 1 #define __W_STOPCODE(sig) ((sig) << 8 | 0x7f) #define WSTOPPED 2 #define __WSTOPSIG(status) __WEXITSTATUS(status) #define WSTOPSIG(status) __WSTOPSIG (status) #define __WTERMSIG(status) ((status) & 0x7f) #define WTERMSIG(status) __WTERMSIG (status) #define WUNTRACED 2 #define __wur #define __x86_64 1 #define x86_64 1 #define _XLOCALE_H 1 #define _XOPEN_SOURCE 700 #define _XOPEN_SOURCE_EXTENDED 1

”`

原文由 jww 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您想要 c++ 中的特定功能,您可以使用此处描述的宏:例如,您想知道 lib chrono 是否可用: __cpp_lib_chrono 包含一个值 201510

http://en.cppreference.com/w/User:D41D8CD98F/feature_testing_macros

可以通过以下方式检查使用的 c++ 标准的版本: __cplusplus 。对于 c++17,值为“201703”,对于 c++14,值为“201402”。但是,如果编译器似乎启用了 c++14,您应该记住,并非所有功能都必须存在。对于特定功能,您可以查看上面的宏。问题的这个特定部分在这里已经有了答案: 如何确定编译器使用的 C++ 标准的版本?

例如 gcc 也有预定义的宏来检查例如 :__GNUC__

https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html

如果您想在编译期间或之前进行检查,有点不清楚,例如在配置步骤中。

如果您想了解配置步骤中的某些内容,您可以编写小型测试程序来测试上述宏并将结果写入标准输出,以便您可以检查 gmake 或 autotools。

您还可以通过使用 -D 标志定义宏来检查 Makefile 中的内容并与编译器共享该信息。

原文由 Klaus 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题