c:检查是否在外部文件的main.c中定义了函数

c:检查是否在外部文件的main.c中定义了函数,c,C,我有一个.c文件(external.c),将在几个不同的项目中使用: #include <stdio.h> void printHello() { printf("Hello World!\n"); // Check if donePrinting is defined in main.c here and call it if it is donePrinting(); } #包括 void printHello(){ printf(“你好,世界!\

我有一个.c文件(external.c),将在几个不同的项目中使用:

#include <stdio.h>

void printHello() {
    printf("Hello World!\n");

    // Check if donePrinting is defined in main.c here and call it if it is
    donePrinting(); 
}
#包括
void printHello(){
printf(“你好,世界!\n”);
//检查main.c中是否定义了donePrinting,如果定义了,则调用它
完成打印();
}
这些不同的项目都有一个调用printHello()的main.c,但并非所有项目都有donePrinting。例如,有些看起来像这样:

#include "external.h"
#include <stdio.h>

int donePrinting() {
    printf("Done printing Hello World\n");
}

int main()
{
   printHello();
   return 0;
}
printHello(donePrinting);
#包括“external.h”
#包括
int donePrinting(){
printf(“已完成打印Hello World\n”);
}
int main()
{
printHello();
返回0;
}
而其他人则是这样:

#include "external.h"
#include <stdio.h>

int main()
{
   printHello();
   return 0;
}
#包括“external.h”
#包括
int main()
{
printHello();
返回0;
}
在external.c中是否有方法检查donePrinting()是否存在?如果不是的话,这方面的工作是什么?我正在考虑在main.c中定义一个全局变量,该变量表示是否存在donePrinting,并在printHello()中检查该全局变量。

看看


弱符号允许您提供默认实现(可能什么也不做),如果您觉得有必要,可以使用
main.c
覆盖该实现。

您需要一种温和的依赖注入形式。将指向需要执行的函数的指针传递到
printHello

void printHello(void (*postPrintCB)(void)) {
    printf("Hello World!\n");

    // Check if donePrinting is defined in main.c here and call it if it is
    if (postPrintCB)
      postPrintCB(); 
}
这样,具有
donePrinting
函数的项目可以这样调用它:

#include "external.h"
#include <stdio.h>

int donePrinting() {
    printf("Done printing Hello World\n");
}

int main()
{
   printHello();
   return 0;
}
printHello(donePrinting);
没有
donePrinting
函数的项目可以调用它,而不需要:

printHello((void(*)(void))0);
当然,您可以稍微键入此内容,以使其更容易在眼睛上显示:

typedef void postPrintCB(void);
#define NULL_POST_PRINT_CB ((postPrintCB*)0)

void printHello(postPrintCB* callback);
在链接时修复它


要求所有项目定义
donePrinting()
。只需添加一个对缺少它的项目没有任何作用的函数。或者在单独的文件中提供一个中心定义,需要空定义的项目可以将该文件添加到其构建步骤。

是的,如果您尝试在不使用
donePrinting
函数的情况下编译此文件,您将得到一个编译错误。运行时检查将不起作用,因为您在构建缺少的函数时会得到一个错误。没有,实际上没有办法检查外部符号是否存在,因为C使用的概念是,每个单元与其他单元分开编译。编译器只知道当前单元中的内容,即它当前正在编译的单元。正如Lantig在回答中提到的,有一些方法可以解决这个问题。