这个问题以前也被问过,但似乎没有一个答案适用于我的文件.我在Windows 11和MacOS 13.2上使用的是VSCode中的clangd 15.0.7.请注意,此项目的实际编译器GCC 11.3.0不会发出任何警告.代码如下:

minmax.h

#ifndef _KPPV_MATH_H_
#define _KPPV_MATH_H_

unsigned int min( unsigned int left, unsigned int right ); /* ISO C requires a translation unit to contain at least one declarationclang(-Wempty-translation-unit) */

unsigned int max( unsigned int left, unsigned int right );

#endif

minmax.c

#include "minmax.h"

unsigned int min( unsigned int left, unsigned int right ) {
    return left < right ? left : right;
}

unsigned int max( unsigned int left, unsigned int right ) {
    return left > right ? left : right;
}

.clangd

CompileFlags:
    Add: [-W, -Wall, -pedantic, -xc, -std=c89, ]
    Remove: [-Wempty-translation-unit]

(删除这件事显然因为-pedantic -Wall而不起作用,但我不想让人们提出这一点,所以我把它加进go ,以表明它不起作用)

推荐答案

该问题源于编译标志中的-xc标志.该标志不仅指"C语言",更具体地说,指"C语言source文件",而不是"C语言头文件".try 将此标志应用于头文件将导致一些行为不当.

相反,您可以将-xc-header标志应用于头文件.

实施此调整的示例.clangd文件:

# Flags for all files
CompileFlags:
    Add: [-W, -Wall, -pedantic, -std=c89]
    Remove: [-Wempty-translation-unit]

---

# Flags for .h files
If:
  PathMatch: .*\.h

CompileFlags:
  Add: [-xc-header]

---

# Flags for .c files
If:
  PathMatch: .*\.c

CompileFlags:
  Add: [-xc]

UPDATE还想提到另一件事:CompileFlags:下的Add:Remove:部分指定编译命令使用edits.

因此,只有当传入的命令(例如来自compile_commands.json)已经包含-Wempty-translation-unit时,Remove: [-Wempty-translation-unit]才有效.

禁用警告可以通过adding个禁用警告的标志来实现,例如:

CompileFlags:
  Add: [-Wno-empty-translation-unit]

这也是可行的(但我建议采用-xc-header%的方法,以获得更好的整体结果).

C++相关问答推荐

try 使用libusb控制音量时LIBUSB_WRIGHT_PIPE

为什么静态说明符为内联函数生成外部定义?

C指针算法在函数参数中的应用

如何使用Python C API实现多线程程序?

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

ATmega328P EEPROM未写入

非常大的数组的大小

我在这里正确地解释了C操作顺序吗?

文件权限为0666,但即使以超级用户身份也无法打开

在CLANG中调试预处理器宏

什么是.c.h文件?

S的这种管道实施有什么问题吗?

是否需要包括<;errno.h>;才能使用perror?

按长度对argv中的单词进行排序

GetText不适用于包含国际字符的帐户名称

与外部SPI闪存通信时是否应禁用中断?

将某些内容添加到链接列表时,列表中的其他项将使用最后添加的项的名称

程序如何解释变量中的值

可以对两种 struct 类型中的任何一种进行操作的C函数

通过GTK';传递回调参数;s g_signal_connect()导致C中出现意外值