是否可以使用预处理器发出不区分大小写的#define语句?
例如,我想将foobar的任何外壳转换为spameggs,即:
FooBar -> spameggs
foobar -> spameggs
fooBar -> spameggs
Foobar -> spameggs
FOOBAR -> spameggs
FOOBAr -> spameggs (an odd possibility I know)
etc
Run Code Online (Sandbox Code Playgroud)
这背后的原因是我想#define一些fortran子程序有不同的名称,它们当然不区分大小写.请注意,我并不真正关心保留大写方案(在最后一个例子中看起来有点无稽之谈).
当我使用预处理器指令时
1 #if(DEBUG)
2 // 1
3 // 2
4 #else
5 // 1
6 // 2
7 #endif
8
9 logger.Debug("Log exception, etc.");
Run Code Online (Sandbox Code Playgroud)
它导致在运行时日志中的行号(例如堆栈跟踪)不正确 - 在上面的示例中,第9行将变为4,因为其余部分将由预处理器解析.
它使日志分析非常困难.
有没有办法解决这个问题,而无需创建方法ConditionalAttribute?
我知道Debugger.IsAttached(现在我正在使用这个解决方案)但我更愿意根据构建模式(调试/发布)运行代码而不是调试器是否附加.
我在Haskell sendfile包中找到了这段代码:
-- sendfile64 gives LFS support
foreign import ccall unsafe "sendfile64" c_sendfile
:: Fd -> Fd -> Ptr (#type off64_t) -> (#type size_t) -> IO (#type ssize_t)
Run Code Online (Sandbox Code Playgroud)
1)什么#type意思和2)为什么我会得到这个错误,
[1 of 1] Compiling Linux.Splice ( splice.hs, splice.o )
splice.hs:40:12: parse error on input `type'
Run Code Online (Sandbox Code Playgroud)
当我自己尝试使用它如下?:
ghc --make splice.hs
Run Code Online (Sandbox Code Playgroud)
splice.hs:
{-# LANGUAGE ForeignFunctionInterface #-}
module Linux.Splice where
import Data.Word
import System.Posix.Types
-- SPLICE
-- fcntl.h
-- ssize_t splice(
-- int fd_in,
-- loff_t* off_in,
-- int fd_out, …Run Code Online (Sandbox Code Playgroud) 是否存在任何C++编译时宏来检测正在编译代码的Windows操作系统.我基本上只想在Win7上支持某些功能.所以我有兴趣做这样的事情
#if <os_macro> = WIN7
// This function would do something valid only on Win7 builds.
bool myfunction {
// do something here
}
#else
// This function would typically return false, since its not supported on OS below win7
bool myfunction {
return false;
}
#endif
Run Code Online (Sandbox Code Playgroud)
还有其他更好的方法吗?
我有一个非常大的代码库,我想通过删除并应用散布在它周围的一些ifdef来清理它.例如,我有很多这样的:
test.c的
#ifdef MYCHECK
// do other sutff
#else
// do stuff
#endif
Run Code Online (Sandbox Code Playgroud)
是否有一个工具允许我运行整个代码库并删除所有代码,只留下我的变量条件中的代码?例如:
nicetool -D MYCHECK *.c
Run Code Online (Sandbox Code Playgroud)
会导致:
test.c的
// do other stuff
Run Code Online (Sandbox Code Playgroud) uint64_t不保证在32位平台上定义类型,并且代码类似
int main() {
uint64_t i = 0;
}
Run Code Online (Sandbox Code Playgroud)
可能会导致类型的编译错误incomplete type.
是否有预处理程序指令来检查是否uint64_t存在?检查类型是否已定义的任何其他方式?
第一个问题:是否可以使用某些参数调用一个函数,并在编译之后在预处理时或编译时将其修改为其他类似的东西
#define func(a,b) func(a,sizeof(a),b)
Run Code Online (Sandbox Code Playgroud)
有些人可能会想到为什么会出现这样的需求.
实际上我使用visual studio 2010在Windows中移植代码,并且有一些函数被弃用,如strcpy(),strcat()等.它说使用strcpy_s()代替.
我知道我可以使用#pragma disable(warning: )或通过提供以下标志来抑制它:
_CRT_NONSTDC_NO_DEPRRECATE
_CRT_SECURE_NO_DEPRECATE
_CRT_SECURE_NO_WARNINGS
Run Code Online (Sandbox Code Playgroud)
但我不想忽视或压制它们.
我试着只是简单地替换字符串而不是忽略使用:
#define strcpy strcpy_s
Run Code Online (Sandbox Code Playgroud)
就像在这里http://msdn.microsoft.com/en-us/library/td1esda9.aspx我读过,如果我不提供第二个arg,那么参数不会不匹配.
我的意思是如果我这样使用它应该没问题:
#define strcpy strcpy_s
strcpy(dest,src);
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.它仍然会产生警告.
strcpy_s的定义是:
errno_t strcpy_s(
char *strDestination,
size_t numberOfElements,
const char *strSource
);
Run Code Online (Sandbox Code Playgroud)
第二个问题:第一个参数是一个指向动态分配内存的指针,所以如何获得该指针指向的内存大小.虽然我读到这是不可行的,但必须有某种方式(希望如此).
顺便问一下是_countof(var)什么?
我有一段这样的代码:
/* T matrix */
#define T11 0
#define T12_re 1
#define T12_im 2
int main(int argc, char *argv[])
{
return 1;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么它使用预处理程序指令来定义全局变量,而不是简单地使用如下代码:
/* T matrix */
double T11 = 0;
double T12_re = 1;
double T12_im = 2;
int main(int argc, char *argv[])
{
return 1;
}
Run Code Online (Sandbox Code Playgroud) c++ variables global-variables c-preprocessor preprocessor-directive
我想知道如何在多行上定义一个非常长的字符串.我尝试了很多不同的模式,但它们都没有工作.这是我的代码.
#define EXAMPLE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
"ccccccccccccccccccccccccccccccccccc"
"ddddddddddddddddddddddddddddddddddd"
Run Code Online (Sandbox Code Playgroud)
我得到语法错误.我得到的错误是
ccompile.h (as included in test.c)
=================
error: syntax error before or at: g
*** Error code 2
Run Code Online (Sandbox Code Playgroud)
我想把"aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbccccbccccccccdddddddd"分配给EXAMPLE.
我尝试使用\和@ \但这没有用.
c string string-literals c-preprocessor preprocessor-directive
C11,6.10.1 有条件包含,约束,1(强调):
控制条件包含的表达式应为整数常量表达式
C11,6.6 常量表达式,6(强调):
整数常量表达式117)应具有整数类型,并且只能具有整数常量、枚举常量、字符
sizeof常量、结果为整数常量的表达式、_Alignof表达式以及作为强制转换的直接操作数的浮点常量的操作数。
$ cat t333.c
#if (int)1.0
#endif
$ gcc t333.c -std=c11 -pedantic -c
t333.c:1:10: error: missing binary operator before token "1.0"
1 | #if (int)1.0
Run Code Online (Sandbox Code Playgroud)
这里(int)1.0是整型常量表达式。它具有整数类型并具有操作数,该操作数是浮点常量,是强制转换的立即操作数。但是,每个gcc代码都是无效的。
这意味着 6.10 预处理指令中使用的“整数常量表达式”受到限制 [1]?标准中有明确规定吗?
[1] 例如,“除了sizeof结果为整数常量、_Alignof表达式和作为强制转换的直接操作数的浮点常量的表达式”
c language-lawyer constant-expression c-preprocessor preprocessor-directive