一、

1, GCC 4.4.5 默认的 C++ 方言不是 C++11。

2,

源码里 64 位类型定义是老式 typedef:

      - ordinary.hpp:42: typedef unsigned long long uint64;
      - ordinary.hpp:43: typedef long long int64;
      - std_tp.h:21: typedef long long int8;
 没有使用 C++11 的 <cstdint>、std::int64_t 等写法。

3, 不能因为在.h文件就判断是c语言而不是c++

typedef long long int8;

这是一个类型定义声明,不是“语句”。它本身既可以被 C 编译器解析,也可以被 C++ 编译器解析;关键看哪个源文件 #include 了它。

在当前项目里,std_tp.h:21 虽然后缀是 .h,但主要被 C++ 代码路径使用,例如 当前 模块的源文件都是 .cpp,Makefile 用的是 g++ 编译:

.cpp.o:; $(CXX) -c $(CFLAGS) $< -o $@

所以这行在当前项目构建中应理解为:被 g++ 按 C++ 方言编译,历史意图大概率是 gnu++98 下的 GNU C++ 扩展。

如果它被 .c 文件包含,并用 GCC 的 gnu89 模式编译,那么它也能成立,但那时才叫 GNU C 扩展。

总结:

typedef long long mint8;

在当前项目里:主要是 GNU++98/C++ 侧用法。
不是因为它在 .h 文件里,就自动属于 GNU C。

二、

CFLAGS 中没有 -std= 选项。这意味着编译器使用其默认标准:

  • C++ 文件(.cpp / .cxx)用 g++ 编译,默认为 GNU C++98(即 -std=gnu++98)——这是 GCC 4.x 系列的默认值,等价于 C++98 + GNU 扩展。
  • C 文件(.c)用 gcc 编译,默认为 GNU C89(即 -std=gnu89)。

long long 的使用依据是 GNU 扩展gnu89 / gnu++98),而非 C++11 标准。

具体来说:

  • long long 在 C99 / C++11 才被正式纳入标准。
  • 但 GCC 作为扩展,在 gnu89gnu++98 模式下也支持 long long,只是在严格标准模式(-std=c89 / -std=c++98,无 gnu 前缀)下会报警告。
  • 项目用的 g++ -m64(无 -std=),默认就是 gnu++98,所以 long long 能编译通过,是靠 GNU 扩展,而不是 C++11。

验证点: makefile 里有 -D__GCC_4_4_5__ 宏,说明本项目明确针对 GCC 4.4.5,该版本默认标准正是 gnu++98,早于 C++11(2011 年发布)。


long long是 C 语言的 还是 C++ 的语句吗?

只有 3 处,全部是 typedef 类型别名定义,这是 C 和 C++ 共用的语法,两者都支持。

具体看:

文件 语句 所在文件类型
std_tp.h` typedef long long int8; .h 头文件,C 风格
ordinary.hpp` typedef unsigned long long uint64; .hpp 头文件,C++
ordinary.hpp typedef long long int64; .hpp 头文件,C++

结论: typedef long long 是纯 C 风格写法,C 和 C++ 都完全相同,看不出 C++ 特有语法。项目里没有用 C++11 的 int64_t(来自 <cstdint>)或 std::int64_t,而是手动 typedef 了自己的别名(mint8 / my_int64_t),这是典型的老式 C/C++ 跨平台移植写法,与 GNU C89 扩展的风格一致。


Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐