处理输入数据以产生用作另一程序输入的输出的程序。有关未指定的预处理器的问题,请使用此标记。如果预处理器有特定标签,则应使用该标签。考虑使用[tag:c-preprocessor],[tag:boost-preprocessor],[tag:oracle-pro-c],[tag:css-preprocessor],[tag:karma-babel-preprocessor],[tag:m4 ]
我正在将 ARM-GCC 上的代码库从 C17 迁移到 C23,并且希望能够在编译时打印 constexpr 计算的评估结果以进行调试。 在 C17 中,我使用了 #pragma message
我正在研究 pypreprocessor,它是一个采用 c 风格指令的预处理器,我已经能够使其像传统预处理器一样工作(它是自消耗的并执行后处理...
如果我不知道在哪里可以找到 simde 标头,我应该写(例如): #if __has_include("simde") # 包含“simde” #elif __has_include() # 包括 如果我不知道在哪里可以找到 simde 标头,我应该写(例如): #if __has_include("simde") # include "simde" #elif __has_include(<simde>) # include <simde> #else # include <intrin.h> #endif 或者我认为正确的答案应该是这样写: #if __has_include("simde") # include "simde" #else # include <intrin.h> #endif __has_include 需要具有与放置在 #include 指令中完全相同的查找规则。来自 [cpp.cond]#4 (强调我的): 搜索由每个包含的 has-include-expression 中的带括号的预处理标记序列标识的头文件或源文件,就好像该预处理标记序列是pp-tokens指令中的#include一样,除了不再进行进一步的搜索之外执行宏扩展。 如果这样的指令不能满足 #include 指令的语法要求,则该程序格式错误。 如果搜索源文件成功,则 has-include-expression 的计算结果为 1;如果搜索失败,则计算结果为 0。 然后我们就知道#include <filename>和#include "filename"之间的区别。再次来自标准 [cpp.include]#3(强调我的): 表单的预处理指令 # include " q-char-sequence " new-line 导致将该指令替换为由 " 分隔符之间的指定序列标识的源文件的全部内容。 以实现定义的方式搜索指定的源文件。 如果不支持此搜索,或者 如果搜索失败,则会重新处理该指令,就好像它读取一样 # include < h-char-sequence > new-line 具有与原始指令相同的包含序列(包括 > 字符,如果有的话)。 所以是的,您的两次尝试的行为应该完全相同。请注意,如果您反向查找并首先检查 <simde>,则可能会有所不同 - 如果您的编译器通过 <> 和 "" 查找找到不同的文件,结果会有所不同。
我有以下包含 CPP 宏的 Haskell 文件。 #define FOO( x, y ) x ++ y 富= FOO(“一”, “b” ++“c”) 条 = 1 当我就此问题致电 cpphs 时...
有没有办法在包含在同一文件中的不同文件中使用相同的#define语句
所以,我有这样的文件结构: 文件A 文件B 文件C 文件A包含文件B和文件C 文件B有: #定义图像(i,j,w)(图像[((i)*(w))+(j)]) FileC 有: #定义图像(i,j,h)(...
我正在使用预处理器指令来消除一些模板化运算符定义的膨胀。例如。 #define BINARY_VECTOR_RETURN_OPERATOR(optype) \ 模板\ 矢量 我正在使用预处理器指令来消除一些模板化运算符定义的膨胀。例如 #define BINARY_VECTOR_RETURN_OPERATOR(optype) \ template <typename T, typename U> \ vector<decltype(T() optype U())> operator optype (const vector<T>& A, const vector<U>& B){ \ vector<decltype(T()*U())> C; \ C.reserve(A.size()); \ typename vector<T>::const_iterator a = A.begin(); \ typename vector<U>::const_iterator b = B.begin(); \ while (a!=A.end()){ \ C.push_back((*a) optype (*b)); \ ++a; ++b; \ } \ return C; \ } \ BINARY_VECTOR_RETURN_OPERATOR(*); BINARY_VECTOR_RETURN_OPERATOR(+); BINARY_VECTOR_RETURN_OPERATOR(-); BINARY_VECTOR_RETURN_OPERATOR(%); 所以效果很好。我现在想做的是有两种操作模式,“调试”和“不调试”,这是我之前通过 #define DEBUG 命令设置的。我想做这样的事情: #define BINARY_VECTOR_RETURN_OPERATOR(optype) \ template <typename T, typename U> \ vector<decltype(T() optype U())> operator optype (const vector<T>& A, const vector<U>& B){ \ #ifdef DEBUG uint n = A.size(); \ if (n != B.size()){ \ char buf[BUFFLEN]; \ sprintf(buf, "Size mismatch in operator+(%s,%s), sizes: (%d, %d), crashing!", \ typeid(A).name(), typeid(B).name(), (int) A.size(), (int) B.size()); \ cout << buf << endl; \ throw("Size Mismatch Error"); \ } \ #endif vector<decltype(T()*U())> C; \ C.reserve(A.size()); \ typename vector<T>::const_iterator a = A.begin(); \ typename vector<U>::const_iterator b = B.begin(); \ while (a!=A.end()){ \ C.push_back((*a) optype (*b)); \ ++a; ++b; \ } \ return C; \ } \ 但编译器似乎不喜欢这样。我可以使用 #ifdef DEBUG 围绕整个事情重新定义整个 BINARY_VECTOR_RETURN_OPERATOR ,但这不是很优雅。有没有办法按照我的第二个示例的精神来实现代码? 您不能在 #if 中包含 #define,但可以在由 #define 控制的代码中包含 #if。 例如: #ifdef DEBUG #define BINARY_VECTOR_RETURN_OPERATOR(optype) \ first-part \ debug-code \ last-part #else #define BINARY_VECTOR_RETURN_OPERATOR(optype) \ first-part \ last-part #endif 如果first-part和last-part足够大,您可能需要为它们定义宏。 我并不是说这是一个好主意,但它确实做了你想要做的事情。 编辑:感谢@okorz001在评论中建议了一个更干净的替代方案: #ifdef DEBUG #define DEBUG_CODE (blah, blah) #else #define DEBUG_CODE /* nothing */ #endif #define BINARY_VECTOR_RETURN_OPERATOR(optype) \ first-part \ DEBUG_CODE; last-part 显然真正的代码会使用更好的名称。 呃,尽量不要将预处理器用于实际代码。这几乎总是一个非常糟糕的主意。 我尝试将宏重组为模板函数。我对 decltypes 很感兴趣,以至于我拿出了一个特征类来降低函数定义的复杂性! 我真的没有看到完全摆脱宏的方法,只是为了实际运算符重载声明的理智。然而,现在它只是到模板函数operator_impl()的简单传递,并且您应该能够对调试代码使用#ifdefs。 template <typename T, typename U, typename Op> struct op_result { typedef vector<decltype( (*((Op*)nullptr)) (*(T*)nullptr, *(U*)nullptr) ) > type; }; template <typename T, typename U, typename Op> inline typename op_result<T, U, Op>::type operator_impl(const vector<T>& A, const vector<U>& B, Op op) { op_result<T, U, Op>::type C; C.reserve(A.size()); typename vector<T>::const_iterator a = A.begin(); typename vector<U>::const_iterator b = B.begin(); while (a!=A.end()) { C.push_back(op(*a, *b)); ++a; ++b; } return C; } #define BINARY_VECTOR_RETURN_OPERATOR(optype) \ template <class T, class U> \ inline vector<decltype( *(const T*)nullptr optype *(const U*)nullptr)> \ operator optype (const vector<T>& A, const vector<U>& B) \ { \ return operator_impl(A, B, [](const T& t, const U& u) {return t optype u;}); \ } assert 或 BOOST_ASSERT 可以完成这项工作吗? (必须承认我以前从未在宏中放置过断言 - 所以在幕后这可能只是重现你的问题) 所以,而不是 #ifdef DEBUG uint n = A.size(); if (n != B.size()){ char buf[BUFFLEN]; sprintf(buf, "Size mismatch in operator+(%s,%s), sizes: (%d, %d), crashing!", typeid(A).name(), typeid(B).name(), (int) A.size(), (int) B.size()); cout << buf << endl; throw("Size Mismatch Error"); } #endif 就写吧 BOOST_ASSERT(A.size() == B.size()); //include <boost/assert.hpp> 或 assert(A.size() == B.size()); //include <assert.h> (这里有一些 boost assert 和 assert.h 的解释链接) 也许有一种方法可以按照第二个示例的精神来实现代码。 你可以像这样使用 if() 而不是 #ifdef // May not be useful but still... #ifdef DEBUG #define DEBUG 1 #else #define DEBUG 0 #endif #define BINARY_VECTOR_RETURN_OPERATOR(optype) \ template <typename T, typename U> \ // Code within #ifdef......... \ if(DEBUG) { \ uint n = A.size(); \ // ............. \ }// end if \ // Code after #ifdef.................. \ vector<decltype(T()*U())> C;\ return C; \ } \ 请测试一下是否有效。
我遇到了从 platform.io 中的环境变量生成的宏的问题: -D SXM_VERSION=\"${sysenv.SXM_VERSION}\" 如您所见,SXM_VERSION 强制启动...
我在理解 C++ 中的预处理器和命名空间时遇到了一些困难。例如,考虑以下程序: #包括 int main() { 使用命名空间 std; ...
是否可以使用注释来创建 API 的多个版本? 我有一个需要实现的目标 API,但它随着时间的推移而增长,我想支持多个级别 - 如果
我试图理解为什么两个相互包含的标头(每个标头包括另一个标头)不能按您预期的方式工作。我想知道我的推理是否正确: 如果你有 FooHeader...
我遇到了 gcc v3.4.4 的错误,需要在代码中添加 #ifdef 来解决该版本编译器的错误。 GCC 编译器预处理器预定义宏是什么
此处定义的包含防护用于防止在编译时加载相同的代码两次。 为什么我的编译器 (GCC) 无法检测到它正在加载相同的代码两次并具有合理的默认值
假设我进行了预处理器检查: #如果(-6 & 5) #error“2 的补码有符号整数” #endif 如果我从二进制补码机交叉编译,会发生什么......
我正在研究有关预处理器确切行为的 C++ 标准(我需要实现某种 C++ 预处理器)。 据我了解,我编造的例子(为了帮助我理解)b...
我想在预处理后查看我的 esp-idf 代码(查看 #ifdef 中的哪些代码将被编译)。 我尝试在我的主 CMake 文件中添加“add_compile_optins(-E)”,但构建失败...
我已经看过所有有关通过“预处理器宏”设置设置预处理器标志的帖子。 由于某种原因,Xcode 似乎忽略了我的设置。 我正在构建一个 Xcode 项目,它是
有没有一种简单的方法可以将预处理器/宏处理器与 YAML 文件一起使用? (即我正在考虑类似于 C 预处理器的东西)? 我们有很多描述......的平面文本文件
给出以下代码: #包括 #包括 int main() { std::numeric_limits::max(); } 我可以避免 max() 的预处理器宏扩展
问题: 我们正在编写 Cuda 代码,它也应该可以由非 cuda 编译器编译(我们使用:nvcc、gcc 和 clang。) 由于 Cuda 需要这些 __host__ __device__ 注释,我们解决了......
使用 gixsql 进行预处理会添加无法编译的 gnucobol 代码
我最近开始在我正在进行的一个项目中使用 gixsql。 https://github.com/mridoni/gix/blob/main/doc/gixsql.md 我按照自述文件中的示例进行操作,但是当使用 GnuCobol 进行编译时,结果是一样的...