我如何使用预处理程序 #if 将编译的值与字符串进行比较
how can i use preprecessor #if to compare value from compilation with a string
我尝试在我想使用的编译器的功能中定义两种不同的行为。我这样做是因为 #include <filesystem>
没有通过英特尔编译器。
我用这个问题做了以下代码: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 (('[=10=]' == lhs[0]) && ('[=10=]' == 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
我尝试在我想使用的编译器的功能中定义两种不同的行为。我这样做是因为 #include <filesystem>
没有通过英特尔编译器。
我用这个问题做了以下代码: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 (('[=10=]' == lhs[0]) && ('[=10=]' == 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