You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4cxx-dev@logging.apache.org by "Thorsten Schöning (JIRA)" <lo...@logging.apache.org> on 2014/02/10 16:00:25 UTC

[jira] [Resolved] (LOGCXX-393) Strange compile error w/ log4cxx, version 0.10.0,gcc version 4.2.1 20070719 [FreeBSD]

     [ https://issues.apache.org/jira/browse/LOGCXX-393?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Thorsten Schöning resolved LOGCXX-393.
--------------------------------------

    Resolution: Fixed

This got fixed in LOGCXX-319.

> Strange compile error w/ log4cxx, version 0.10.0,gcc version 4.2.1 20070719  [FreeBSD]
> --------------------------------------------------------------------------------------
>
>                 Key: LOGCXX-393
>                 URL: https://issues.apache.org/jira/browse/LOGCXX-393
>             Project: Log4cxx
>          Issue Type: Improvement
>    Affects Versions: 0.10.0
>         Environment: gcc 4.2.1
> FreeBSD 8.2-RELEASE-p4 (amd64)
>            Reporter: Jim Carroll
>            Assignee: Curt Arnold
>            Priority: Minor
>
> Quite strange (but minor) issue using log4cxx. The following code snippet fails to compile:
> #include <log4cxx/logger.h>
> log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger("fn");
> void fn() {
>     if (logger->isTraceEnabled())
>         LOG4CXX_TRACE(logger, "Trace");
>     else if (logger->isDebugEnabled())
>         LOG4CXX_DEBUG(logger, "Debug");
>     }
> Compiled with the following command: g++ -c -I/usr/local/include t2.cpp
> Results in:
> t2.cpp: In function 'void fn()':
> t2.cpp:6: error: expected primary-expression before 'else'
> t2.cpp:6: error: expected `;' before 'else'
> t2.cpp:8: error: expected `}' at end of input
> You can solve the compile error, by enclosing the LOG4CXX_TRACE statement in braces, thusly:
> #include <log4cxx/logger.h>
> log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger("fn");
> void fn() {
>     if (logger->isTraceEnabled()) {
>         LOG4CXX_TRACE(logger, "Trace");
>         }
>     else if (logger->isDebugEnabled())
>         LOG4CXX_DEBUG(logger, "Debug");
>     }
> Here's where it get's really strange....the compiler only generates the error, when you have the 'else if' statement immediately following the LOG4CXX_TRACE() macro.  So this piece of code also compiles without errors.
> #include <log4cxx/logger.h>
> log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger("fn");
> void fn() {
>     if (logger->isTraceEnabled())
>         LOG4CXX_TRACE(logger, "Trace");
>     }
> I strongly suspect it's some sort of strange artifact of the pre-processor, but I'm having difficulty figuring out what it specifically doesn't like.  I've attached the pre-processor output below.
> Jim C.
> -----
> (REMOVED MOST OF THE CPP OUTPUT FOR BREVITY)
> # 1910 "/usr/local/include/log4cxx/logger.h" 2
> # 2 "t2.cpp" 2
> log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger("fn");
> void fn() {
>  if (logger->isTraceEnabled())
>   { if (__builtin_expect(logger->isTraceEnabled(), 0)) { ::log4cxx::helpers::MessageBuffer oss_; logger->forcedLog(::log4cxx::Level::getTrace(), oss_.str(oss_ << "Trace"), ::log4cxx::spi::LocationInfo("t2.cpp", __PRETTY_FUNCTION__, 5)); }};
>  else if (logger->isDebugEnabled())
>   { if (__builtin_expect(logger->isDebugEnabled(), 0)) { ::log4cxx::helpers::MessageBuffer oss_; logger->forcedLog(::log4cxx::Level::getDebug(), oss_.str(oss_ << "Debug"), ::log4cxx::spi::LocationInfo("t2.cpp", __PRETTY_FUNCTION__, 7)); }};
>  }



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)