首页 > 解决方案 > 我如何使用 preprecessor #if 将编译中的值与字符串进行比较

问题描述

我尝试在要使用的编译器的功能中定义两种不同的行为。我这样做是因为#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 (('\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)
....

标签: c++11preprocessor

解决方案


不完全是您问题的答案,但是...据我所知,每个编译器都定义了一组特定的预处理器宏来识别编译器和编译器的确切版本。

这个页面中有一个有用的这个(和其他)宏的列表。

所以,我想,你的代码可以简单地写成如下

#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

推荐阅读