scoopydoo 发表于 2025-2-7 15:57:00

[笔记] 码农战AI,如何避免C/C++程序中的"empty translation unit"警告

前些天买了块 SSD 顺便给电脑重装了系统,当然也免不了要重新搭建开发环境。以前俺在嵌入式开发方面基本就是 STM32 ,开发工具主要用 VS Code 加 Keil MDK 的组合。这次决定做些改变,换成了 WSL2 下面的 GCC + CMAKE,编辑器依旧用 VS Code。

环境搭好之后做的第一个小测试就翻车了,用 STM32CubeMX 生成了一个 CMAKE 项目,编译时出现了 "empty translation unit" 警告!

/home/.../STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rcc.c:1391: warning: ISO C forbids an empty translation unit [-Wpedantic]

出现这个警告的原因是高版本的 GCC 的检查更严格,所谓的 "empty translation unit" 就是指一个源文件中没有任何注释之外的代码。解决的办法很简单,加一些没用的代码进去就行了。

本着内事不决问 AI、外事不决也问 AI 的精神,俺就在 VS Code 中问 Copilot 该怎么消除这个警告,它的回答也很简单,加一个啥也不干的 dummy_fuction 函数:

// Add a dummy function to avoid empty translation unit warning
void dummy_function(void) {}

看了 AI 的答案,俺不由得露出了得意的笑容,你小子还是嫩啊!当即反问它如果有多个文件的话,搞一堆 dummy_function 不会冲突吗?难道要一个个分别取不同的名字吗?那岂不是很麻烦!

AI 赶紧承认自己考虑不周了,不过解决方法也很简单,把 dummy_function 改成静态函数就可以了。

// Add a dummy function to avoid empty translation unit warning
static void dummy_function(void) {}

认错态度还是很诚恳地,这小子孺子可教啊,那就试试这个方法吧。

不试不知道、一试吓一跳,走了旧警告,迎来新警告!

/home/.../stm32g0xx_ll_rcc.c:1388:13: warning: 'dummy_function' defined but not used [-Wunused-function]

俺把新问题丢给 AI,看看吧你干的好事!AI 说对不起是我大意了,你看看这个代码行不行:

#if defined(__GNUC__) && !defined(__clang__)
__attribute__((unused)) static void dummy_function(void) {}
#else
static void dummy_function(void) {}
#endif

我靠,这小子有两把刷子啊,不仅解决了新警告的问题,而且还很贴心地搞了很大一坨来适应不同的编译器,算是及格了

通过这一番较量,俺赶脚目前的 AI 编程还只能打打辅助,或者帮初学者解决一些入门问题,真想要替代码农还有很长的路要走。

最后,俺还是没有采用 AI 给出的方案,自己写了个更简洁的:

// Add a weak dummy function to avoid empty translation unit warning [-Wpedantic]
void __attribute__((weak)) dummy_function(void) {}

ssffzz1 发表于 2025-2-7 16:12:40

-Wpedantic

????????????????????

scoopydoo 发表于 2025-2-7 16:22:27

ssffzz1 发表于 2025-2-7 16:12
-Wpedantic

????????????????????

开了 -pedantic 编译选项,会对不符合 ANSI/ISO 标准的代码给出警告。

locky_z 发表于 2025-2-7 17:27:07

以往学习一门新语言,基本是靠help文件和搜索,但搜索得到的只是一两个语句,还要自己试错、调试、修改,即使有高手在旁边指点,也要很长时间才能掌握。
现在有了AI,学习一门新语言的效率大大提高,因为你在提问/回答中会获得很大学习进步,回答中会详尽给出为啥用这个函数、为啥这样写。。
但不要指望AI能帮一个没有编程概念的人写出有效的程序,因为他们通常不会提问。

估计以后软件公司找程序员,不用指定熟悉某某语言的人了,只需熟悉一种语言的人就行。

girlexplorer 发表于 2025-2-7 17:50:57

老衲不懂c语言,好奇的问了一下AI,不知AI回答是否正确:

在 WSL2 下使用 GCC 和 CMake 编译 STM32CubeMX 生成的项目时,遇到警告 `/home/.../STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rcc.c:1391: warning: ISO C forbids an empty translation unit [-Wpedantic]` 是由于在某些编译器中,ISO C 标准要求每个源文件必须包含至少一个非空的语句或声明。这个警告通常出现在头文件(.h)中。

### 原因分析

1. **头文件中的空白行**:STM32CubeMX 生成的代码可能在某些头文件中包含了大量空白行,导致编译器认为这是一个空翻译单元。
2. **未包含任何非空语句或声明**:即使有空白行,如果这些空白行没有足够的内容来满足 ISO C 标准的要求,仍然会导致警告。

### 改进建议

1. **检查头文件中的空白行**:
   - 打开 `STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rcc.c` 文件。
   - 检查第 1391 行附近的代码,确保没有多余的空白行。

2. **添加非空语句或声明**:
   - 如果头文件中确实只有空白行,可以在这些空白行之前添加一个 `#include <stdio.h>` 或其他简单的包含语句。
   ```c
   #include <stdio.h>

   // 其他代码...
   ```

3. **使用 CMake 的预处理选项**:
   - 在 CMakeLists.txt 文件中设置 `-Wno-pedantic` 选项,以忽略这个警告。不过请注意,这并不是一个最佳实践,因为 ISO C 标准要求每个翻译单元必须包含至少一个非空的语句或声明。
   ```cmake
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-pedantic")
   ```

4. **检查其他头文件**:
   - 确保所有相关的头文件中也都没有多余的空白行,并且包含至少一个非空的语句或声明。

通过以上步骤,可以解决 `/home/.../STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rcc.c:1391: warning: ISO C forbids an empty translation unit [-Wpedantic]` 的警告。


scoopydoo 发表于 2025-2-7 17:58:37

locky_z 发表于 2025-2-7 17:27
以往学习一门新语言,基本是靠help文件和搜索,但搜索得到的只是一两个语句,还要自己试错、调试、修改,即 ...

会提问题的人,即使在没有 AI 之前,肯定也是善于阅读文档和搜索资料、自学能力强的。

说白了,现阶段的 AI 在大多数应用场景还只能是一个提高效率的工具。

scoopydoo 发表于 2025-2-7 18:08:12

girlexplorer 发表于 2025-2-7 17:50
老衲不懂c语言,好奇的问了一下AI,不知AI回答是否正确:

在 WSL2 下使用 GCC 和 CMake 编译 STM32CubeM ...

不知道你用的哪家的 AI,它分析出来的两点原因,第一条纯属扯淡,第二条是本来“应该”是正确的,但是语言组织有问题,还是给说错了。

至于解决方法,俺没有去试验,应该是管用的,但是并不是合理的方案。

chipset009 发表于 2025-2-8 21:49:44

那空文件是干什么用的,难道不应该删除?

scoopydoo 发表于 2025-2-8 21:58:49

chipset009 发表于 2025-2-8 21:49
那空文件是干什么用的,难道不应该删除?

不是空文件,只不过该文件所有的内容都包含在 #ifdef ... #endif 里面了,当 #ifdef 条件不成立的时候,就相当于是一个空文件了。

MF35_ 发表于 2025-2-12 15:58:30

应该只要声明一个函数就可以了,你这样加一行试试:
extern void dummy_func(void);

scoopydoo 发表于 2025-2-12 16:59:02

MF35_ 发表于 2025-2-12 15:58
应该只要声明一个函数就可以了,你这样加一行试试:

这样肯定是可以的,但是在 IDE 或者编译器中会提示找不到这个函数,看着难受啊 ......

MF35_ 发表于 2025-2-12 17:20:33

本帖最后由 MF35_ 于 2025-2-12 17:24 编辑

scoopydoo 发表于 2025-2-12 16:59
这样肯定是可以的,但是在 IDE 或者编译器中会提示找不到这个函数,看着难受啊 ......


不会啊,如果你声明了一个不存在的函数,只要没有任何地方使用这个函数,就不会报警告和错误,应该是你IDE的问题,有些IDE有智能高亮,你声明一个未定义的函数,它如果找不到,有可能会给你那个函数打一个“未定义”的标签,我见过这种IDE,但这不影响编译器,编译器是不会对没有引用的声明做检查的

scoopydoo 发表于 2025-2-12 17:32:33

MF35_ 发表于 2025-2-12 17:20
不会啊,如果你声明了一个不存在的函数,只要没有任何地方使用这个函数,就不会报警告和错误,应该是 ...

俺说的就是这个意思,不影响编译,但是看着难受 :lol
页: [1]
查看完整版本: [笔记] 码农战AI,如何避免C/C++程序中的"empty translation unit"警告