2

我正在更新一些旧代码,并且不小心在里面留下了一个不再定义的宏:

// "DETAIL" is not defined anywhere
if (DETAIL ("notebook")) {
    // ...
}

代码仍然可以编译和链接(它是一个 .so 库),但是当它被加载时,我得到:

gtk3-widget-factory: symbol lookup error: /usr/lib/gtk-3.0/3.0.0/
theming-engines/libmurrine.so: undefined symbol: DETAIL

为什么这在编译时没有被捕获?我猜 CDETAIL没有任何定义就认为它是一个函数int -> int,对吧?有没有办法让编译器(gcc)更严格并在编译时抱怨?我不认为我在源文件或头文件中直接使用任何没有定义的符号。

4

1 回答 1

4

您的分析是正确的:DETAIL被视为隐式定义的函数。

gcc手册

-Wimplicit-function-declaration (C and Objective-C only)

在声明之前使用函数时发出警告。在 C99 模式(-std=c99-std=gnu99)下,默认启用此警告,并通过-pedantic-errors. 此警告也由 启用-Wall

此外,正如@Jonathan Leffler 在评论中指出的那样:

此外,在某些版本的 GCC 中,这是一个错误-Werror=implicit-function-declaration(对于任何其他显式警告选项也是如此)。所有警告都可以用-Werror.

于 2013-03-13T11:30:48.767 回答