使用编译错误搜索C函数定义

时间:2018-12-12 07:32:03

标签: c function compilation

我正在一个C项目中,在多个地方对C函数的定义相同。我正在尝试使用诸如“错误:foo_func()的冲突类型”之类的编译错误来获取C函数的定义;还提供了标头文件声明为“ bar_file.h:<行号>:注意:此处是foo_func()的先前声明”。我想依靠编译错误而不是像grep这样的命令,因为编译器可以确定要链接的函数,因此可以确定正在使用的函数定义。

我能够在故意应用编译错误的情况下找到头文件。有没有办法使用类似的技术来找到我在编译时使用的函数的定义?

示例:让我们找到包含我们正在使用的函数的声明的头文件。通过有目的地引入已知参数不匹配的多个定义,我们可能会遇到以下编译错误。

$ gcc -Wall -Wextra -c exmpl_01.c -I./
exmpl_01.c:5: error: conflicting types for ‘call_func_other_file’
exmpl_01.h:1: note: previous declaration of ‘call_func_other_file’ was here

$ head -4 exmpl_01.c
#include <stdio.h>
#include "exmpl_01.h"
int call_func(void);
int call_func_other_file(char *);

$ cat exmpl_01.h
int call_func_other_file(void);

2 个答案:

答案 0 :(得分:1)

您可以尝试在单独的翻译单元中故意添加重复的定义。然后将所有对象文件链接在一起(启用调试符号编译)。链接器会告诉您在哪个文件中以及在哪一行上定义了重复项。

答案 1 :(得分:0)

也许您正在寻找-E开关?

// a.h
int a() {
  return 1;
}

然后,我们有

// main.c
#include "a.h"

int main() {
  return a();
}

,并且通过-E您可以得到

> gcc -E main.c
# 1 "main.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 331 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "main.c" 2
# 1 "./a.h" 1
int a() {
  return 1;
}
# 2 "main.c" 2

int main() {
  return a();
}

现在,假设我们的源文件中有另一个文件

// b.h
float a() {
  return 1.0;
}

main.c略有不同

#include "a.h"
#include "b.h"

int main() {
  return a();
}

您将能够看到函数的最后定义

gcc -c -E main.c
# 1 "main.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 331 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "main.c" 2
# 1 "./a.h" 1
int a() {
  return 1;
}
# 2 "main.c" 2
# 1 "./b.h" 1
float a() {
  return 1.0;
}
# 3 "main.c" 2

int main() {
  return a();
}

但是,我不确定这是否是您要找的东西;)

嗯...如果您想在某个时候停下来,也许这会帮助您:

#include "a.h"
#include "b.h"

int main() {
  a();
  #error Quit!
  printfun("aaa");
}

这样,编译将失败#error

> gcc -c  -Wfatal-errors main.c
In file included from main.c:2:
./b.h:1:7: fatal error: conflicting types for 'a'
float a() {
      ^
./a.h:1:5: note: previous definition is here
int a() {
    ^
1 error generated.

或者,您可以简单地引入某种假类型

#include "a.h"

struct fake_type {
  int fake_component;
};

struct fake_type *a();

int main() {
  a();
}

并执行错误

> gcc -c  -Wfatal-errors main.c
main.c:7:19: fatal error: conflicting types for 'a'
struct fake_type *a();
                  ^
./a.h:1:5: note: previous definition is here
int a() {
    ^
1 error generated.