C++;编译器是否在编译期间动态替换命名空间? 我是C++新手,想了解预处理、编译和链接步骤是如何工作的。当我试图使用图书馆时,我偶然发现了一个有趣的行为 代码

C++;编译器是否在编译期间动态替换命名空间? 我是C++新手,想了解预处理、编译和链接步骤是如何工作的。当我试图使用图书馆时,我偶然发现了一个有趣的行为 代码,c++,compilation,g++,C++,Compilation,G++,以下是我在此示例中使用的代码: #包括 #包括 定义_字符串(姓名,“Tugberk”,“要问候的人的姓名”); int main(int argc,char*argv[]){ gflags::ParseCommandLineFlags(&argc,&argv,true); std::cout多亏了Igor上面的评论,我发现这是因为gflags命名空间也被导出以实现向后兼容性。请参阅和 在安装时,这在gflags.h文件中创建了以下条目: // Import gflags library sym

以下是我在此示例中使用的代码:

#包括
#包括
定义_字符串(姓名,“Tugberk”,“要问候的人的姓名”);
int main(int argc,char*argv[]){
gflags::ParseCommandLineFlags(&argc,&argv,true);

std::cout多亏了Igor上面的评论,我发现这是因为
gflags
命名空间也被导出以实现向后兼容性。请参阅和

在安装时,这在
gflags.h
文件中创建了以下条目:

// Import gflags library symbols into alternative/deprecated namespace(s)
#include "gflags_gflags.h"
gflags\u gflags.h
文件的生成内容如下:

\ifndef GFLAGS\u GFLAGS\H_
#错误内部标头gflags\u gflags.h只能包含在gflags.h中
#恩迪夫
#如果不符合GFLAGS\u NS\u GFLAGS\H_
#定义GFLAGS\u NS\u GFLAGS\u H_
名称空间gflags{
使用GFLAGS_名称空间::int32;
使用GFLAGS_名称空间::uint32;
使用GFLAGS_名称空间::int64;
使用GFLAGS_名称空间::uint64;
使用GFLAGS_名称空间::RegisterFlagValidator;
使用GFLAGS_名称空间::CommandLineFlagInfo;
使用GFLAGS_名称空间::GetAllFlags;
使用GFLAGS_名称空间::ShowUsageWithFlags;
使用GFLAGS_名称空间::ShowUsageWithFlagsRestrict;
使用GFLAGS_名称空间::DescribeOneFlag;
使用GFLAGS_名称空间::SetArgv;
使用GFLAGS_名称空间::GetArgvs;
使用GFLAGS_名称空间::GetArgv;
使用GFLAGS_名称空间::GetArgv0;
使用GFLAGS_名称空间::GetArgvSum;
使用GFLAGS_名称空间::ProgramInvocationName;
使用GFLAGS_名称空间::ProgramInvocationShortName;
使用GFLAGS_名称空间::ProgramUsage;
使用GFLAGS_名称空间::VersionString;
使用GFLAGS_名称空间::GetCommandLineOption;
使用GFLAGS_名称空间::GetCommandLineFlagInfo;
使用GFLAGS_名称空间::GetCommandLineFlagInfoOrdi;
使用GFLAGS_名称空间::FlagSettingMode;
使用GFLAGS_名称空间::设置_标志\u值;
使用GFLAGS_名称空间::设置_标志(如果默认);
使用GFLAGS_名称空间::设置_标志\u默认值;
使用GFLAGS_名称空间::SetCommandLineOption;
使用GFLAGS_名称空间::SetCommandLineOptionWithMode;
使用GFLAGS_名称空间::FlagSaver;
使用GFLAGS_名称空间::CommandlineFlagsIntoString;
使用GFLAGS_名称空间::ReadFlagsFromString;
使用GFLAGS_名称空间::AppendFlagsTofile;
使用GFLAGS_名称空间::ReadFromFlagsFile;
使用GFLAGS_名称空间::BoolFromEnv;
使用GFLAGS_名称空间::Int32FromEnv;
使用GFLAGS_名称空间::Uint32FromEnv;
使用GFLAGS_名称空间::Int64FromEnv;
使用GFLAGS_名称空间::uint64 fromenv;
使用GFLAGS_名称空间::DoubleFromEnv;
使用GFLAGS_名称空间::StringFromEnv;
使用GFLAGS_名称空间::SetUsageMessage;
使用GFLAGS_名称空间::SetVersionString;
使用GFLAGS_名称空间::ParseCommandLineNonHelpFlags;
使用GFLAGS_名称空间::HandleCommandLineHelpFlags;
使用GFLAGS_名称空间::AllowCommandLineReparsing;
使用GFLAGS_名称空间::RepasseCommandlineNonHelpFlags;
使用GFLAGS_名称空间::ShutDownCommandLineFlags;
使用GFLAGS_名称空间::FlagRegisterer;
#ifndef SWIG
使用GFLAGS_名称空间::ParseCommandLineFlags;
#恩迪夫
}//名称空间gflags
#endif//GFLAGS\n\u GFLAGS\H_

这就是
#define
预处理器指令所做的-类似于宏替换。@1201程序很有意义,但我不确定编译器是如何知道如何首先用它替换代码中的
gflags::
部分的。另一种询问方法是编译器如何通过声明来知道我指的是什么e> gflags::
?是因为头文件名为
gflags.h
?@Ron在我的示例中,我无法从该文档中找出如何解决
gflags
。你能给我指出具体的措辞吗?@Ron这对我来说非常有意义。我正在努力的是
gflags\u命名空间
在我的代码中根本没有使用,而是在库头文件中使用。因此,我无法理解代码中的
gflags::
引用是如何被解释为“用‘google’替换它的”。另一种可能是命名空间别名,如
namespace gflags=google;
或更微妙的
namespace gflags=gflags\u namespace;
as -v --64 -o /tmp/ccONcT86.o /tmp/ccFyWgz8.s
# nm -C /tmp/ccONcT86.o
0000000000000000 V DW.ref.__gxx_personality_v0
                 U _GLOBAL_OFFSET_TABLE_
00000000000001a0 t _GLOBAL__sub_I__ZN3fLS10FLAGS_nameB5cxx11E
                 U _Unwind_Resume
000000000000006f t __static_initialization_and_destruction_0(int, int)
0000000000000000 B fLS::FLAGS_name[abi:cxx11]
0000000000000000 W fLS::StringFlagDestructor::StringFlagDestructor(void*, void*)
0000000000000000 W fLS::StringFlagDestructor::StringFlagDestructor(void*, void*)
0000000000000000 n fLS::StringFlagDestructor::StringFlagDestructor(void*, void*)
0000000000000000 W fLS::StringFlagDestructor::~StringFlagDestructor()
0000000000000000 W fLS::StringFlagDestructor::~StringFlagDestructor()
0000000000000000 n fLS::StringFlagDestructor::~StringFlagDestructor()
0000000000000000 W fLS::dont_pass0toDEFINE_string[abi:cxx11](char*, char const*)
0000000000000060 b fLS::FLAGS_noname
0000000000000070 b fLS::d_name
0000000000000068 b fLS::o_name
0000000000000020 b fLS::s_name
                 U google::FlagRegisterer::FlagRegisterer<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(char const*, char const*, char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)
                 U google::ParseCommandLineFlags(int*, char***, bool)
                 U std::allocator<char>::allocator()
                 U std::allocator<char>::~allocator()
                 U std::ostream::operator<<(std::ostream& (*)(std::ostream&))
                 U std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)
                 U std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
                 U std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
                 U std::ios_base::Init::Init()
                 U std::ios_base::Init::~Init()
                 U std::cout
                 U std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
0000000000000000 r std::piecewise_construct
0000000000000008 b std::__ioinit
                 U std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
                 U std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
0000000000000000 W operator delete(void*, void*)
0000000000000000 W operator new(unsigned long, void*)
                 U __cxa_atexit
                 U __dso_handle
                 U __gxx_personality_v0
                 U __stack_chk_fail
0000000000000000 T main
// Import gflags library symbols into alternative/deprecated namespace(s)
#include "gflags_gflags.h"