我正在使用宏来定义代码中的简单变量(类似这样):
#define foobar 1
//...
barfoo(foobar);
Run Code Online (Sandbox Code Playgroud)
为了防止错误,我想foobar通过验证输入来确保是一个数字.foobar应该总是一个数字,所以它可以很简单.
显然,预处理器不处理数学,所以任何用算术生成某种类型错误的希望都会丢失.
我想常量因为这个原因确实更好,但我正在尝试使用所有宏,因此它在我拥有的配置文件中是一致的(有些确实需要宏).正则表达式可能是一个好的解决方法,但GCC似乎不支持[与宏]这个(加上,http://xkcd.com/1171/).
我有以下小程序:
#include <iostream>
int main() {
std::cout << "Time: " << __TIME__ << std::endl;
std::cout << "Timestamp: " << __TIMESTAMP__ << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产生以下输出:

正如你所看到的,__TIME__有一个很大的不同__TIMESTAMP__,它提前4秒.
为什么会这样?怎么会两次出现这样的差异?
即使程序的构建时间不到4秒,所以这种差异来自何处?
我正在尝试添加一个ac宏,它编译一个初始化为函数名的局部变量.
例如.
void foo (void)
{
stubmacro;
}
void bar (void)
{
stubmacro;
}
Run Code Online (Sandbox Code Playgroud)
基本上编译为:
void foo (void)
{
char*function_name="foo";
}
void bar (void)
{
char*function_name="bar";
}
Run Code Online (Sandbox Code Playgroud)
我一直很难使用C预处理器宏,特别是在字符串化方面
宏使用预定义的函数 ..
#define stubmacro char*function_name=##_FUNCTION__
Run Code Online (Sandbox Code Playgroud)
无论如何,我的stubmacro宏是错误的,我会喜欢它的一些帮助
根据这个问题,似乎有一些灵活性可以写出 -
#ifndef _HEADER_H
Run Code Online (Sandbox Code Playgroud)
要么:
#ifndef __HEADER___H__
Run Code Online (Sandbox Code Playgroud)
它不是一成不变的.
但我不明白为什么我们首先使用下划线.为什么我不能写:
#ifndef header.h
Run Code Online (Sandbox Code Playgroud)
这有什么问题?为什么我们在任何地方放置下划线并将所有东西都资本化?预处理器用下划线做什么?
是否有可能使用C++预处理器发出#error一个特定#define的使用?像这样的东西:
#define this_must_not_be_used #error You shouldn't use that.
Run Code Online (Sandbox Code Playgroud) 是否可以使用宏来粘贴运算符?(类似于标记粘贴但与实际操作符相关.
例:
#define DO(a, operator, b) a ##operator b
DO(1, +, 3); // 4
DO(4, <<, 1); // 8
Run Code Online (Sandbox Code Playgroud)
注意 - 这是一个非常简单的例子.我的实际用例是我正在研究一种有很多位移操作的算法,我希望能够将我需要的移位运算符传递给宏(>>或<<)以使事情变得更简单.
你能解释下面的代码吗?我们如何使用#defineC的关键字?
#include <stdio.h>
#define int int*
int main(void) {
int *p;
int q;
p = 10;
q = 5;
printf("%d %d", p, q);
// your code goes here
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
10 5
Run Code Online (Sandbox Code Playgroud) 我正在查看老师给我的代码,我发现了这个:
#define setBit(var, bitnum) (var)|=(1<<(bitnum))
#define resBit(var, bitnum) (var)&=~(1<<(bitnum))
#define ROW_RESET setBit(PORTA,4) ; resBit(PORTA,4)
Run Code Online (Sandbox Code Playgroud)
前两个#define陈述是自解释的,但我对第三个问题有所了解.第三个陈述(行)是对的吗?我们可以用分号(;)后写语句,如果是,那么请你解释一下这里发生了什么.
#define在C#中的目的究竟是什么?
我目前使用https://github.com/citrix/ShareFile-NET上的ShareFile .NET API开发应用程序
但是,样本不会运行,因为我要调用的函数在此块中:
#if Async
#endif
Run Code Online (Sandbox Code Playgroud)
我知道我能做到
#define Async
Run Code Online (Sandbox Code Playgroud)
在文件的顶部,但是我必须为每个在#if块中具有功能的文件执行此操作吗?这是为了什么目的?
目标C很长,我决定使用self而不是this.现在,我希望通过将此代码放在程序开头或附近的某个地方来结束这种挫败感:
#define this self
Run Code Online (Sandbox Code Playgroud)
我知道这会编译,并且可能会像我期望的那样工作.但是,我不禁认为这有不可预见的后果.这是安全的事情,还是在我试图解决的简单问题之外会出现问题?
c-preprocessor ×10
c ×6
c++ ×3
macros ×2
c# ×1
ifndef ×1
keyword ×1
objective-c ×1
self ×1
validation ×1
visual-c++ ×1