有没有办法让C++ Prepossessor为所有自动生成的函数打印代码,例如复制和移动构造函数,以及通过命令行选项复制和移动赋值操作符,可能是g ++或clang?
我发现了一些类似于以下内容的遗留代码.说我有以下定义:
#define FOO(x) bar
Run Code Online (Sandbox Code Playgroud)
x从未在定义中引用.那么,这是否意味着FOO()中放置的任何文本都无关紧要?
我正在看的代码散布着调用,例如FOO(someValue);我假设预处理器正在简单地替换整个语句bar,无论是什么someValue?有点因为什么存在而被抛弃x.
我将在类库中使用#if DEBUG指令.已编译的ClassLibrary.dll将在单独的Application.exe中使用.
我的调试代码是否会在以下情况下执行?
我的印象是,#define并且#include可以在我们的代码中的任何地方写入,只要它们在预处理器在将宏提取到编译器之前处理宏时不会产生任何语法错误.
我运行了以下代码:
#include <stdio.h>
int main(void) {
int B = A;
#define A 4
printf("%d", B);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它产生了以下错误:
prog.c:在函数'main'中:prog.c:4:13:错误:'A'未声明(在此函数中首次使用)int B = A; ^ prog.c:4:13:注意:每个未声明的标识符仅针对它出现的每个函数报告一次
但是,当我这样做时,它的工作原理!
#include <stdio.h>
int main(void) {
#define A 4
int B = A;
printf("%d", B);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
不知道我在这里缺少什么,但为什么编译器会给出"未声明的A"这样的错误?
是这样,当预处理器读取的行#define A 4,将开始更换任何A与4 从代码的后续行?
假设我们有两个类,Foo和Bar.
在Foo.h中
#ifndef MYPROJ_FOO
#define MYPROJ_FOO
....
# endif
Run Code Online (Sandbox Code Playgroud)
在Bar.cpp中,我们还需要保护包括如
#ifndef MYPROJ_FOO
#include <Foo.h>
#endif
Run Code Online (Sandbox Code Playgroud)
还是简单#include 就足够了?如果我们已经有头球防守队员,那么对我来说似乎是多余的,但是我经常看到这样的练习,因此想知道我是否遗漏了什么.谢谢!
我想要一个macro声明int一个给定名称和可选的初始化表达式.
我尝试在Stack Overflow上使用这个答案,但没有成功.
这是我试过的:
#define macro(...) int FIRST(__VA_ARGS__)(REST(__VA_ARGS__))
Run Code Online (Sandbox Code Playgroud)
这样使用时没有问题:
macro(foo);
Run Code Online (Sandbox Code Playgroud)
但是当给出初始化器时会出现错误:
macro(foo, 42);
Run Code Online (Sandbox Code Playgroud)
另一种 - 只是使用时会在没有参数的情况下__VA_ARGS__从-pedanticGCC 发出警告.
我怎样才能解决这个问题?
()当没有初始化表达式时,是否也可以避免括号 - 这意味着没有零初始化但是默认?
请注意,我的真实用例不仅适用int于任何类型,而且使用像boost这样的第三方也不是一种选择.
我正在尝试阅读和理解用C编写的文件(这里)并且不太了解C(或者如果它是C++开头),我想知道如何:
#define BEGIN yy_start = 1 + 2 *
Run Code Online (Sandbox Code Playgroud)
当像这样调用时:
BEGIN(new_state)
Run Code Online (Sandbox Code Playgroud)
工作中.我知道BEGIN是一个宏/占位符设置yy_start.但是我找不到任何关于传入的参数是如何处理的, 操作数也没有让我到处找.
问题:如果没有明确处理它们,如何在C/C++宏中处理参数?
以下代码在g ++ -std = c ++ 11编译器的编译中失败.
# include<iostream>
# include<vector>
using namespace std;
# define stlf(x) x.begin(), x.end()
# define repf(it, a, b) for(auto it = a ; it != b ; ++it)
/*
// Also, following alternative fails
# define repf(it, a, b) for(auto it = a ; it != b ; ++it)
# define stlf(x) x.begin(), x.end()
*/
typedef vector<int > vi;
# define pd(x) printf("%d", x);
int main(void){
vi arr(10, -1);
repf(arr, stlf(arr))
pd(arr[i]);
return 0; …Run Code Online (Sandbox Code Playgroud) 我很惊讶地发现它ATOMIC_FLAG_INIT被描述为C++ 11标准中定义的预处理器宏.这是一个例外,还是新的C++标准真的涵盖了预处理器步骤?
对我来说,预处理器本身就是一种实用的语言,现在的趋势似乎是不鼓励使用它.
在代码中间有一个C语言语句.我不知道它为什么存在以及编译器如何不返回错误.是C绑定吗?这是否意味着该模块可以被C程序使用,反之亦然?
USE LISTS
USE LINKEDLIST_ROUTINES
#include "macros.h"
IMPLICIT NONE
PRIVATE
Run Code Online (Sandbox Code Playgroud)