C 链接阶段不生成警告

标签 c linux gcc linker

我有以下文件:

主.c:

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

f.c:

char *f = "linker";

GNUMake 文件:

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

运行生成文件时,我没有收到任何编译警告/错误。为什么?

最佳答案

因为你欺骗了编译器……而它信任你。

在 main.c 中,您告诉编译器 f 是一个函数(声明/原型(prototype)),但实际上 f 是一个指向 f.c(定义)中定义的长度为 7 的(不可修改的)字符数组的指针。

不要欺骗编译器。

关于C 链接阶段不生成警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9605317/

相关文章:

c - 无效插入/列表不起作用 - C

c - 填充和打印二维数组

linux - bash 脚本中的“全局化”Bash 函数

linux - grep 命令在 testdir 中工作但不在 "real"目录中

c - 允许用户在文件中搜索单词的程序

objective-c - 在 objective-c 中将 CMTime 转换为人类可读时间

linux - bash 脚本计算文件夹中有多少个常规文件和多少个目录

gcc - 编译器在 Fedora 28 上缺乏 asm-goto 支持

c++ - 如何在 CMake 中以可移植的方式获取 libstdcxx 隐式链接目录

c++ - 为什么在不返回值的情况下流出非 void 函数的末尾不会产生编译器错误?