如何解决我如何使用前置程序#if比较来自编译的字符串值
我尝试在要使用的编译器的函数中定义两种不同的行为。我这样做是因为#include <filesystem>
不会随Intel编译器一起传递。
我用这个问题来编写以下代码:How to compare strings in C conditional preprocessor-directives
#include <iostream>
// compares two strings in compile time constant fashion
constexpr int c_strcmp( char const* lhs,char const* rhs )
{
return (('\0' == lhs[0]) && ('\0' == rhs[0])) ? 0
: (lhs[0] != rhs[0]) ? (lhs[0] - rhs[0])
: c_strcmp( lhs+1,rhs+1 );
}
#define COMPILER_INTEL "Intel"
#define COMPILER_GNU "GNU"
#if 0 == c_strcmp(CURRENT_COMPILER,COMPILER_INTEL)
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
#elif 0 == c_strcmp(CURRENT_COMPILER,COMPILER_GNU)
#include <filesystem>
namespace fs = std::filesystem;
#elif
#error "Compiler unknow"
#endif
int main() {
std::cout << fs::path("").extension() << std::endl;
return 0;
}
用于编译的行是:
icc main.cpp -lstdc++fs -std=c++17 -DCURRENT_COMPILER="Intel"
我遇到以下错误:
main.cpp(14): error: function call is not allowed in a constant expression
#if 0 == c_strcmp(CURRENT_COMPILER,COMPILER_INTEL)
^
main.cpp(14): error: expression must have integral or enum type
#if 0 == c_strcmp(CURRENT_COMPILER,COMPILER_INTEL)
^
main.cpp(17): error: function call is not allowed in a constant expression
#elif 0 == c_strcmp(CURRENT_COMPILER,COMPILER_GNU)
^
main.cpp(17): error: expression must have integral or enum type
#elif 0 == c_strcmp(CURRENT_COMPILER,COMPILER_GNU)
....
解决方法
这不是您问题的完全答案,但是...据我所知,每个编译器都定义了一组特定的预处理器宏,以标识编译器和编译器的确切版本。
在this page中有一个有用的宏列表。
所以,我想,您的代码可以简单地编写如下
#ifdef __INTEL_COMPILER
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
#elif defined __GNU_C__
#include <filesystem>
namespace fs = std::filesystem;
#else
#error "Compiler unknow"
#endif
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。