链接两个C程序

时间:2013-12-12 11:05:19

标签: c

我正在使用头文件合并两个C程序。

第一个程序

#include<explore.h>

int main()
{
    int a =10;
    explore();
}

探索计划

#include<stdio.h> 

int explore()
{
    // I want to use the value of a. Can I use it? How can sue it?
}

我想在探索程序文件中使用aexplore()的值。

我可以使用它吗?怎么可以使用呢?

5 个答案:

答案 0 :(得分:1)

好的,先关闭。使用现在的代码,除了a函数之外,你将无法在任何地方使用int main,因为它是该函数的局部变量。
要么将其作为参数传递,要么将其声明为全局(以及 extern )。无论哪种方式,我都选择将其作为参数传递,如果a将被函数explore更改,则可以执行以下两项操作之一:

int explore( int val)
{
    //do stuff
    return new_val;
}
//call:
a = explore(a);//assigns return int to a

或者,如果返回的int表示某种状态,则将指针传递给a。这可能,如果你是指针的新手,似乎是一种过度复杂化的确定方法,但它非常常见且非常有用(添加了关于为什么这对底部有用的注释):

int explore(int *val)
{
    *val += 123;//add 123 to val's value
    //this is NOT the same as val += 123, because that's shifting the pointer!
    return 0;
}
//call:
int return_val = explore(&a);//pass &[address-of]a

现在,链接两个源文件很简单,但是你说你正在使用一个头文件,一切都很好,但你似乎没有把它包含在任何地方,也没有显示它的样子。我怀疑你在编译代码时遇到了麻烦......如果是这样,请告诉我们你尝试过的东西(你如何编译代码),以及你得到的错误。
如果您需要一个如何手动链接2个源文件的基本示例:Here's a previous answer of mine that shows, step by step, how to link 2 files

为什么指针?:
很多原因,真的。这里只是几个:

  • 限制内存使用量:如果你在整个地方传递大型结构 (即反复复制相同的数据),你的代码会很慢,你的堆栈可能会结束混淆了相同的价值。 (递归引起的堆栈溢出)
  • C可以分配堆内存,只能通过指针访问,不能将指针变量转换为非指针。
  • 返回值通常是告知您可能发生的错误的方法。

最后一点至关重要。如果您要将a传递给explore进行一些复杂的计算,请在此过程中更改a的值。如果,在功能的一半,某些东西变成梨形,你如何通知呼叫者a的值不再可靠?简单:

int complex_function( int *val)
{
    _Bool negative = *val > 0 ? false : true;
    //do all sorts of magic stuff
    //val wasn't negative, but is now, possible maxed int?
    if (negative == false && *val < 0) return -1;//notify using -1
    return 0;//usually, 0 means everything went well ok
}
//call like so:
if ((complex_function(&a)) != 0) exit( EXIT_FAILURE);//it's all gone wrong
//else, continue

现在指针非常有用。它并不需要你弄乱所有太多的临时变量,在整个地方创建值的副本,并比较它们以得出相同的结论。

答案 1 :(得分:0)

explore为参数调用a

尽管如此,你似乎并没有两个“程序”。一个程序中有两个源文件。因此,在两个部分中使用a的另一种方法是在main.c中定义a并在explore.h中将其声明为“extern”。但请记住,a对您的程序来说有点“全球化”。

答案 2 :(得分:0)

将a的值(或指针)传递给探索函数

传递值(a的副本)

#include<stdio.h> 
int explore(int value)
{

}

通过引用传递(指向a的指针)

#include<stdio.h> 
int explore(int *value)
{

}

答案 3 :(得分:0)

更改为int explore(int some_var),然后您可以在此功能中自由使用some_var。在main中,您需要拨打explore(a)

答案 4 :(得分:0)

首先,它们不是两个程序。这是一个单一的计划。你正在写一个函数。如果要将a的值传递给该函数,则需要将其作为参数传递:

#include<explore.h>
int main()
{
  int a =10;
  explore(a);
}

#include<stdio.h> 
int explore(int a)
{
  // you can now use a here
}