C功能可见性

时间:2015-05-31 02:59:12

标签: c

如何只为其他特定的.c文件中的函数显示C函数?

假设我有一个foo1函数,它调用其他foo2函数(在不同的.c文件中),我想从我的main函数调用foo1,但我希望foo2对foo1以外的任何函数都是不可见的,如下所示:

/**
    foo1.c
*/
void foo1()
{
    if (condition_is_true){
        foo2();
    }
}

/**
    foo2.c
*/
#include <stdio.h>

void foo2()
{
    printf("Hello world!\n");
}

/**
    main.c
*/
void foo1(void);
void foo2(void);

int main()
{
    foo1();
    foo2(); /*unresolved external*/
}

编译时

$ cc -omain main.c foo1.c foo2.c

我希望链接器抱怨“未定义引用`foo2'”。

1 个答案:

答案 0 :(得分:0)

通常,如果要在另一个.c源文件中显示一个.c源代码文件中的函数,则将该函数的定义放入.h文件中并将其包含在您想要的.c文件中可见。例如:

file foo1.c
int somefunc1(some parameters)
  {
    Do some stuff.
  }

file foo1.h
int somefunc1(some parameters);

file foo2.c
#include "foo1.h"

int foo2(Some parameters)
  {
    Do some stuff.
    foo1(asdfasdf)
    Do some more stuff.
  }

这通常是你做的。但是,你所要求的恰恰相反。我不确定为什么在链接器运行时需要未定义的引用,但是您设置编译的方式,这些文件将被传递给链接器。所以你唯一能做的就是在文件列表中没有foo2.c。如果您正在使用其中一个主库中的某些内容,即使您未指定包含文件,它仍会被链接。例如:

$$$ ->more test3.c

int main(void)
  {
    printf("hello world\n");
    return(0);
  }


$$$ ->clang -std=c11 -Wall -Wextra -o test3 test3.c
test3.c:8:5: warning: implicitly declaring library function 'printf' with type 'int (const char *, ...)'
    printf("hello world\n");
    ^
test3.c:8:5: note: please include the header <stdio.h> or explicitly provide a declaration for 'printf'
1 warning generated.

所以你要求的我并不认为可以或应该这样做。