我自己拥有一个包含许多功能的工具包。我还有一个mainprog链接到这个工具包,所以它可以使用它的功能。
工具包来源:
#include <iostream>
using namespace std;
namespace {
int foo() {
cout << "doing foo" << endl;
return 0;
}
int tmp = foo(); // can't just call foo() without an assignment, compiler complains
}
// bunch of useful functions
MainProg来源:
#include <iostream>
#include "toolkit_header.h"
using namespace std;
int main() {
// fiddle about for a while
cout << "using toolkit functions..." << endl;
// start using toolkit functions
return 0;
}
这将输出:
doing foo
using toolkit functions...
从工具包中获取一个函数的能力在每个main()的开头自动执行,它们链接它对我来说非常有用(有很多这些函数,并要求所有的mainprogs显式调用函数开始并不是一个可接受的解决方案),但感觉就像一件坏事。这样做有什么严重错误吗?
我有一个谷歌,但这似乎是一个难以找到的问题,因为有很多关于调用未命名命名空间中的函数的点击。
答案 0 :(得分:0)
您是否意识到您的工具包代码在执行main之前正在执行?发布的代码实际上是100%正常,并且在任何方面都不是坏事。
当您尝试使用工具静态初始化程序中的其他文件中的其他静态对象时,可能会出现问题,因为未定义其初始化顺序。事实上,您已经在使用一个静态对象 - std::cout
,除非您使用的是C ++ 11或更高版本,否则此时无法保证cout
被初始化。启动C ++ 11你有这个保证,所以这应该没问题。
答案 1 :(得分:0)
从未命名的命名空间中执行代码
未命名的命名空间中的代码的执行方式与命名或全局命名空间中的代码完全相同。
从工具包中获取函数的能力在每个main()的开头自动执行......但感觉就像是一件坏事。这样做有什么严重错误吗?
实际上,该功能在 main
之前执行。
可能存在问题。如果某些程序依赖于在初始化静态对象之前调用的函数,除非通过依赖于它的代码显式调用该函数,否则无法保证会发生这种情况。
如果可以接受静态初始化期间没有代码可能依赖于正在执行的函数,那么应该没有问题。也就是说,如果您打算让工具包可以被其他人重复使用,那么您可能无法做出这种解决方案。如果他们通过显式调用函数来决定什么时候执行,那么工具包的用户会感激不尽。
您可以使用静态对象的构造函数来避免kludgy int
赋值:
struct static_init {
static_init() {
cout << "doing foo" << endl;
}
} static_init;
答案 2 :(得分:0)
另请注意,如果foo()或tmp未在代码中的任何其他位置使用(即在.cpp文件中,因为它是未命名的命名空间),链接器可能会优化它,因此根本不会调用它