c 是否可以在不使用 include 的情况下使用其他文件中的变量?
c Can you use variables from other files without using include?
我正在看这个项目的fftools/ffmpeg.c文件的ffmpegproject.In的代码,第519行有一段代码:
519 if (do_benchmark) {
520 int maxrss = getmaxrss() / 1024;
521 av_log(NULL, AV_LOG_INFO, "bench: maxrss=%ikB\n", maxrss);
522 }
我用gdb找到do_benchmark变量的定义位置:
(gdb) info variables do_benchmark
All variables matching regular expression "do_benchmark":
File fftools/ffmpeg_opt.c:
159: int do_benchmark;
160: int do_benchmark_all;
但是,我找不到像 include fftools/ffmpeg_opt.c 这样的语句 fftools/ffmpeg.c file.I 使用 find + grep 无济于事。
$ find . -type f | xargs grep 'ffmpeg_opt'
grep: ./.git/objects/pack/pack-c2a6a6b1765b632f6fa88814ec92d3b0e4c11dad.pack:Match to binary file
grep: ./.git/index:Match to binary file
grep: ./ffmpeg:Match to binary file
./fftools/ffmpeg_opt.d:fftools/ffmpeg_opt.o: fftools/ffmpeg_opt.c fftools/ffmpeg.h config.h \
grep: ./fftools/ffmpeg_opt.o:Match to binary file
./fftools/Makefile:OBJS-ffmpeg += fftools/ffmpeg_opt.o fftools/ffmpeg_filter.o fftools/ffmpeg_hw.o
grep: ./ffmpeg_g:Match to binary file
我想尝试类似的方法,但失败了。
演示-01.c
#include "stdio.h"
int main(void){
fptintf(stdout, "demo: %d", demo);
return 0;
}
演示-02.c
int demo = 0;
$ gcc demo-01.c demo-02.c -o demo
demo-01.c: In the function ‘main’:
demo-01.c:4:33: Error: ‘demo’ is not declared (first use in this function)
4 | fprintf(stdout, "demo: %d", demo);
| ^~~~
demo-01.c:4:33: Note: Each undeclared identifier is only reported once in the function in which it appears.
这是为什么?
Can you use variables from other files without using include?
是的。如果您知道变量是如何在另一个翻译单元生成的库或目标文件中声明的,您可以在不包含头文件的情况下对变量进行extern
声明 - 但是这不是这种情况下发生的事情。
I cannot find a statement like include fftools/ffmpeg_opt.c in the fftools/ffmpeg.c
不,变量在fftools/ffmpeg.h
中声明extern
是这样的:
extern int do_benchmark;
实际定义在 fftools/ffmpeg_opt.c
中(如您所知),它将被编译到库中。这使得包括 fftools/ffmpeg.h
在内的 .c
文件可以在与库链接时使用 fftools/ffmpeg_opt.c
中定义的变量。
我正在看这个项目的fftools/ffmpeg.c文件的ffmpegproject.In的代码,第519行有一段代码:
519 if (do_benchmark) {
520 int maxrss = getmaxrss() / 1024;
521 av_log(NULL, AV_LOG_INFO, "bench: maxrss=%ikB\n", maxrss);
522 }
我用gdb找到do_benchmark变量的定义位置:
(gdb) info variables do_benchmark
All variables matching regular expression "do_benchmark":
File fftools/ffmpeg_opt.c:
159: int do_benchmark;
160: int do_benchmark_all;
但是,我找不到像 include fftools/ffmpeg_opt.c 这样的语句 fftools/ffmpeg.c file.I 使用 find + grep 无济于事。
$ find . -type f | xargs grep 'ffmpeg_opt'
grep: ./.git/objects/pack/pack-c2a6a6b1765b632f6fa88814ec92d3b0e4c11dad.pack:Match to binary file
grep: ./.git/index:Match to binary file
grep: ./ffmpeg:Match to binary file
./fftools/ffmpeg_opt.d:fftools/ffmpeg_opt.o: fftools/ffmpeg_opt.c fftools/ffmpeg.h config.h \
grep: ./fftools/ffmpeg_opt.o:Match to binary file
./fftools/Makefile:OBJS-ffmpeg += fftools/ffmpeg_opt.o fftools/ffmpeg_filter.o fftools/ffmpeg_hw.o
grep: ./ffmpeg_g:Match to binary file
我想尝试类似的方法,但失败了。
演示-01.c
#include "stdio.h"
int main(void){
fptintf(stdout, "demo: %d", demo);
return 0;
}
演示-02.c
int demo = 0;
$ gcc demo-01.c demo-02.c -o demo
demo-01.c: In the function ‘main’:
demo-01.c:4:33: Error: ‘demo’ is not declared (first use in this function)
4 | fprintf(stdout, "demo: %d", demo);
| ^~~~
demo-01.c:4:33: Note: Each undeclared identifier is only reported once in the function in which it appears.
这是为什么?
Can you use variables from other files without using include?
是的。如果您知道变量是如何在另一个翻译单元生成的库或目标文件中声明的,您可以在不包含头文件的情况下对变量进行extern
声明 - 但是这不是这种情况下发生的事情。
I cannot find a statement like include fftools/ffmpeg_opt.c in the fftools/ffmpeg.c
不,变量在fftools/ffmpeg.h
中声明extern
是这样的:
extern int do_benchmark;
实际定义在 fftools/ffmpeg_opt.c
中(如您所知),它将被编译到库中。这使得包括 fftools/ffmpeg.h
在内的 .c
文件可以在与库链接时使用 fftools/ffmpeg_opt.c
中定义的变量。