c++11 - 我如何使用 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)
....
解决方案
不完全是您问题的答案,但是...据我所知,每个编译器都定义了一组特定的预处理器宏来识别编译器和编译器的确切版本。
在这个页面中有一个有用的这个(和其他)宏的列表。
所以,我想,你的代码可以简单地写成如下
#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
推荐阅读
- firebase - 使用 Firebase 无密码登录,无需将链接发送到电子邮件
- javascript - 如何将 React 表单转换为 React Native
- git - GitHub 的 view-branch 功能是无状态的吗?如果是,它是如何实现的?
- python-3.x - 使用 python 保存电报组中的消息
- java - 使用堆栈和队列 ADTS 在 Java 中将中缀转换为后缀
- ios - iOS如何在后台线程中使用全局属性
- wordpress - 在访客的私人帖子上获取 WordPress 漂亮的永久链接(WP 5.7 中的更改)
- r - 在 R 中:有条件地将数值除以 1000
- android - Android 通过 JSSC 和 NDK 使用 USB OTG 模式原生访问 tty 串口
- java - 填充 HashMap
基于单词及其在大型多行文本文件中的出现