从另一个文件调用#define

时间:2015-02-06 08:21:36

标签: c

这是我的代码。我有file1.c和file2.c。我想从file2.c调用MESSAGE,但我似乎无法做到。我是C的新手,所以我真的不知道该怎么做。我已经研究过,但我似乎无法找到具体的答案。三江源。

#define MESSAGE "this is message!"

helloworld(){
     printf("%s",MESSAGE);
     getch();
     }

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "file2.c"

int main(void)
{
  helloworld();
}

5 个答案:

答案 0 :(得分:2)

你有一些误解:首先是&#34;呼叫&#34;一个宏。这是不可能的,即使宏看起来像一个函数它不是一个函数,并且宏实际上不是由编译器处理的。相反,宏是由preprocessor处理的单独语言的一部分,它接受源文件并修改它以生成编译器看到的translation unit。 (有关&#34;汇编&#34的差异阶段的更多信息;请参阅例如this reference。)

预处理器通过在输入源文件中基本上执行搜索替换来完成此操作:当它看到宏&#34;调用&#34;它只是用&#34; body&#34;取而代之。的宏。当它看到#include指令时,它会预处理文件,然后将内容放在指令的位置。

因此,在您的代码中,当预处理器看到宏MESSAGE时,它实际上被"this is message!"取代。实际的编译器根本看不到MESSAGE,它只看到字符串文字。


另一个误解是你如何使用#include指令。您不应该使用它来包含文件。而是单独编译源文件(创建目标文件),然后链接生成的目标文件以及形成最终可执行文件所需的任何库。

要解决所有源文件可用的宏(和其他声明)的问题,请使用头文件。这些类似于源文件,但只包含声明和宏。然后在两个源文件中包含头文件,两个源文件都将知道头文件中可用的声明和宏。

所以在你的情况下你应该有三个文件:主源文件,包含该函数的源文件,以及包含宏和函数声明的头文件(也称为原型) 。像

这样的东西

头文件,例如header.h

// First an include guard (see e.g. https://en.wikipedia.org/wiki/Include_guard)
#ifndef HEADER_H
#define HEADER_H

// Define the macro, if it needs to be used by all source files
// including this header file
#define MESSAGE "this is message!"

// Declare a function prototype so it can be used from other
// source files
void helloworld();

#endif

主要源文件,例如main.c

// Include a system header file, to be able to use the `printf` function
#include <stdio.h>

// Include the header file containing common macros and declarations
#include "header.h"

int main(void)
{
    // Use the macro
    printf("From main, MESSAGE = %s\n", MESSAGE);

    // Call the function from the other file
    helloworld();
}

另一个文件,例如hello.c

// Include a system header file, to be able to use the `printf` function
#include <stdio.h>

// Include the header file containing common macros and declarations
#include "header.h"

void helloworld(void)
{
    printf("Hello world!\n");
    printf("From helloworld, MESSAGE = %s\n", MESSAGE);
}

现在,如果您使用命令行编译器,如gccclang,那么您可以通过执行此操作来简单地构建它。

$ gcc -Wall main.c hello.c -o myhello

该命令将获取两个源文件main.chello.c,并对它们运行预处理器和编译器以生成(临时)目标文件。然后将这些目标文件与标准C库链接在一起,形成程序myhello(这是-o选项的作用,命名输出文件)。

然后您可以运行myhello

$ ./myhello
From main, MESSAGE = this is message!
Hello world!
From helloworld, MESSAGE = this is message!

答案 1 :(得分:1)

file1.c中,MESSAGE是预处理器宏,这意味着文本MESSAGE将替换为字符串"this is message!"。它在文件外部不可见。这是因为在C中,translation units是编译器的最终输入,并且这些转换单元已经将所有预处理器宏替换为相应参数的标记。

如果你想拥有一个公共变量,你应该在extern头文件中将变量声明为.h,然后在#include中将文件声明为需要使用它的文件。 / p>

请参阅Compiling multiple C files in a program

答案 2 :(得分:0)

您必须将#define放在.h文件中,并将其包含在您要使用它的.c个文件中。

答案 3 :(得分:0)

这是代码试试这个:

在File1.C

#define FILE1_C
#include "file1.h"

helloworld()
{
  printf("%s",MESSAGE);
  getch();
 }

在File2.C

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "file1.h"

int main(void)
{
  helloworld();
}

在File1.h

#ifdef FILE1_C
#define MESSAGE "this is message!"
#define EXTERN
#else
#define EXTERN extern
#endif


EXTERN helloword()

答案 4 :(得分:0)

您可以按照以下步骤编写文件并编译代码。

file1.h

#ifndef _FILE1_H
#define _FILE1_H

#define MESSAGE "this is message!"
extern void helloworld();

#endif

file1.c中

#include "file1.h"

helloworld()
{
  printf("%s",MESSAGE);
  getch();
 }

file2.c中

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "file1.h"

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

编译时,

gcc -Wall file1.c file2.c -o myprog

./ MYPROG