
一、1 GCC 4.4.5 默认的 C 方言不是 C11。2源码里 64 位类型定义是老式 typedef-ordinary.hpp:42:typedefunsignedlonglonguint64;-ordinary.hpp:43:typedeflonglongint64;-std_tp.h:21:typedeflonglongint8;没有使用 C11 的 cstdint、std::int64_t 等写法。3, 不能因为在.h文件就判断是c语言而不是ctypedeflonglongint8;这是一个类型定义声明不是“语句”。它本身既可以被 C 编译器解析也可以被 C 编译器解析关键看哪个源文件 #include 了它。在当前项目里std_tp.h:21 虽然后缀是 .h但主要被 C 代码路径使用例如 当前 模块的源文件都是 .cppMakefile 用的是 g 编译.cpp.o:; $(CXX) -c $(CFLAGS) $ -o $所以这行在当前项目构建中应理解为被 g 按 C 方言编译历史意图大概率是 gnu98 下的 GNU C 扩展。如果它被 .c 文件包含并用 GCC 的 gnu89 模式编译那么它也能成立但那时才叫 GNU C 扩展。总结typedef long long mint8;在当前项目里主要是 GNU98/C 侧用法。不是因为它在 .h 文件里就自动属于 GNU C。二、CFLAGS中没有-std选项。这意味着编译器使用其默认标准C 文件.cpp/.cxx用g编译默认为 GNU C98即-stdgnu98——这是 GCC 4.x 系列的默认值等价于 C98 GNU 扩展。C 文件.c用gcc编译默认为 GNU C89即-stdgnu89。long long的使用依据是GNU 扩展gnu89/gnu98而非 C11 标准。具体来说long long在 C99 / C11 才被正式纳入标准。但 GCC 作为扩展在gnu89和gnu98模式下也支持long long只是在严格标准模式-stdc89/-stdc98无gnu前缀下会报警告。项目用的g -m64无-std默认就是gnu98所以long long能编译通过是靠 GNU 扩展而不是 C11。验证点makefile里有-D__GCC_4_4_5__宏说明本项目明确针对 GCC 4.4.5该版本默认标准正是gnu98早于 C112011 年发布。❯long long是 C 语言的 还是 C 的语句吗只有 3 处全部是typedef类型别名定义这是 C 和 C 共用的语法两者都支持。具体看文件语句所在文件类型std_tp.htypedef long long int8;.h头文件C 风格ordinary.hpptypedef unsigned long long uint64;.hpp头文件Cordinary.hpptypedef long long int64;.hpp头文件C结论typedef long long是纯 C 风格写法C 和 C 都完全相同看不出 C 特有语法。项目里没有用 C11 的int64_t来自cstdint或std::int64_t而是手动typedef了自己的别名mint8/my_int64_t这是典型的老式 C/C 跨平台移植写法与 GNU C89 扩展的风格一致。