这是我的代码。我有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();
}
答案 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);
}
现在,如果您使用命令行编译器,如gcc
或clang
,那么您可以通过执行此操作来简单地构建它。
$ gcc -Wall main.c hello.c -o myhello
该命令将获取两个源文件main.c
和hello.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>
答案 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