C++ 使用静态关键字复制符号和函数

C++ 使用静态关键字复制符号和函数,c++,objective-c,c,coding-style,C++,Objective C,C,Coding Style,我想创建一个Commons.h文件,在那里我可以放置一些共享信息、常量、宏和助手函数 此文件必须包含在我的应用程序的许多部分中 如果使用此语法创建函数,则会出现重复符号错误: int myFunction(int a){ //do something.. } 而如果我添加静态关键字,则不会出现错误 static int myFunction(int a){ //do something.. } 1) 这是向项目添加辅助函数的有效/正确方法吗? 2) 在该定义中添加static

我想创建一个
Commons.h
文件,在那里我可以放置一些共享信息、常量、宏和助手函数

此文件必须包含在我的应用程序的许多部分中

如果使用此语法创建函数,则会出现
重复符号
错误:

int myFunction(int a){ 
   //do something..
}
而如果我添加静态关键字,则不会出现错误

static int myFunction(int a){ 
   //do something..
}
1) 这是向项目添加辅助函数的有效/正确方法吗?
2) 在该定义中添加
static
关键字会发生什么情况?

如果在函数声明之前使用关键字
static
,则只能在定义该函数的实际翻译单元(.cpp、.c或.m)内部使用该函数

因此,它与关键字
extern
相反,
extern
函数的默认存储类说明符

使用helper函数是错误的,因为它甚至不编译

相反,您应该将助手文件中的函数声明为extern。并且使用它而不需要再次实现它。可以在helper.h的.c/.cpp/.m中实现一次


如果将某个函数用作其他文件的辅助函数,则最好使用
extern
关键字,即使它不是必需的。这是对程序员的一个提示,此函数在其他地方使用。

如果在函数声明之前使用关键字
static
,则只能在定义此函数的实际翻译单元(.cpp、.c或.m)内部使用此函数

因此,它与关键字
extern
相反,
extern
函数的默认存储类说明符

使用helper函数是错误的,因为它甚至不编译

相反,您应该将助手文件中的函数声明为extern。并且使用它而不需要再次实现它。可以在helper.h的.c/.cpp/.m中实现一次


如果将某个函数用作其他文件的辅助函数,则最好使用
extern
关键字,即使它不是必需的。这是对程序员的一个提示,这个函数在其他地方使用。

不是真的。您正在创建一个单独的函数实例 在每个翻译单元中。你应该做的只是申报 标题中的函数:

extern int myFunction( int a );
并在某个源文件中定义它。(请注意 上面的
extern
是可选的,因为它对所有人都是隐式的 函数声明,通常省略它。我添加了它 这里只是强调一个事实,你是在声明,而不是
定义。)

不太可能。您正在创建一个单独的函数实例 在每个翻译单元中。你应该做的只是申报 标题中的函数:

extern int myFunction( int a );
并在某个源文件中定义它。(请注意 上面的
extern
是可选的,因为它对所有人都是隐式的 函数声明,通常省略它。我添加了它 这里只是强调一个事实,你是在声明,而不是

定义。)

整个程序中函数的定义,即。如果没有
static
关键字,则在包含标题的每个位置都会得到一个定义
MyFunction
,这违反了@jrok当然,也可以选择使用
inline
…@Angew,但除非您有其他性能问题,否则这不是一个好主意。函数的定义不属于头文件。最好把它放在一个静态库中,并为库提供一个头,这样就不会在整个地方复制代码。C++或Objy-C标签中的一个是错误的。在整个程序中定义函数,即。如果没有
static
关键字,则在包含标题的每个位置都会得到一个定义
MyFunction
,这违反了@jrok当然,也可以选择使用
inline
…@Angew,但除非您有其他性能问题,否则这不是一个好主意。函数的定义不属于头文件。最好把它放在一个静态库中,并为库提供一个头,这样就不会在整个地方复制代码。C++或Objy-C标签中的一个是错误的。他的静态数据不是针对某个类成员的(或者至少如果是,他没有这样说)
static
extern
相反,但仅在自由函数上,而不是在成员上<代码>外部对类成员不合法。他没有说它是任何成员。什么课?我知道。但是您谈到了“在实际类中”使用函数。类中的任何内容都是成员。第一句不正确。静态函数可以在编译单元内的任何位置访问(即编译中的
.c
.m
文件)。哦,是的,我指的是翻译单元,谢谢更正。现在我明白了。对不起,詹姆士坎茨,是我的错。???他的静态数据不是针对某个类成员的(或者至少如果是,他没有这样说)
static
extern
相反,但仅在自由函数上,而不是在成员上<代码>外部对类成员不合法。他没有说它是任何成员。什么课?我知道。但是您谈到了“在实际类中”使用函数。类中的任何内容都是成员。第一句不正确。静态函数可以在编译单元内的任何位置访问(即编译中的
.c
.m
文件)。哦,是的,我指的是翻译单元,谢谢更正。现在我明白了。抱歉@JamesKanze,是我的错。因此,如果我想创建一组帮助函数,最好使用原型创建头文件,并在源文件中移动实现。我看见那只小苹果