Определение функции поиска C с использованием ошибки компиляции - PullRequest
0 голосов
/ 12 декабря 2018

Я работаю над проектом C, который имеет одно и то же определение функции C в нескольких местах.Я пытаюсь получить определение функции C, используя ошибки компиляции, такие как «error: конфликтующие типы для foo_func ()»;который также обеспечивает объявление файла заголовка как «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 голосов
/ 19 декабря 2018

Вы можете попытаться сознательно добавить дублирующее определение в отдельную единицу перевода.Затем свяжите все объектные файлы вместе (скомпилированные с включенными символами отладки).Компоновщик скажет вам, в каком файле и на какой строке определена копия.

0 голосов
/ 12 декабря 2018

Может быть, вы ищете -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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...