Стадия связывания C не генерирует предупреждения - PullRequest
2 голосов
/ 07 марта 2012

У меня есть следующие файлы:

main.c:

int f(void);  
int main(void)
{
    f();
    return 0;
}

fc:

char *f = "linker";

GNUMakefile:

CC = gcc
CFLAGS = -Wall -g

all: main

main: main.o f.o

main.o: main.c
f.o: f.c

clean:
    rm -rf *.o main

При запуске make-файла я не получаю предупреждений / ошибок компиляции.Почему?

Ответы [ 3 ]

8 голосов
/ 07 марта 2012

Потому что вы солгали компилятору ... и он вам доверяет.

В main.c вы сказали, что компилятор f - это функция ( объявление / прототип ), но f - это, фактически, указатель на (неизменяемый) массив символов длиной 7 определено в ФК ( определение ).

Не врите компилятору.

2 голосов
/ 07 марта 2012

Вы сказали, что компилятор f является функцией.Это не так, но реализация не обязана записывать тип, который необходимо будет здесь предупредить.Gcc этого не делает, некоторые другие реализации могут.

Обходной путь - поместить объявление f в заголовок и включить его в каждую единицу перевода, что сделает ошибку очевидной.

0 голосов
/ 07 марта 2012

если вы поместите объявление int f (void);в заголовочный файл, который вы включаете в оба файла, вы получите сообщение об ошибке компилятора.В вашем текущем случае с компиляцией все в порядке.

в make-файле я пропускаю часть gcc main.c и часть ln

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...